`

spring Interceptor小应用

 
阅读更多

性能监控

如记录一下请求的处理时间,得到一些慢请求(如处理时间超过500毫秒),从而进行性能改进,一般的反向代理服务器如apache都具有这个功能,但此处我们演示一下使用拦截器怎么实现。

 

实现分析:

1、在进入处理器之前记录开始时间,即在拦截器的preHandle记录开始时间;

2、在结束请求处理之后记录结束时间,即在拦截器的afterCompletion记录结束实现,并用结束时间-开始时间得到这次请求的处理时间。

 

问题:

我们的拦截器是单例,因此不管用户请求多少次都只有一个拦截器实现,即线程不安全,那我们应该怎么记录时间呢?

解决方案是使用ThreadLocal,它是线程绑定的变量,提供线程局部变量(一个线程一个ThreadLocal,A线程的ThreadLocal只能看到A线程的ThreadLocal,不能看到B线程的ThreadLocal)。

package cn.javass.chapter5.web.interceptor;
public class StopWatchHandlerInterceptor extends HandlerInterceptorAdapter {
    private NamedThreadLocal<Long>  startTimeThreadLocal = 
new NamedThreadLocal<Long>("StopWatch-StartTime");
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, 
Object handler) throws Exception {
        long beginTime = System.currentTimeMillis();//1、开始时间
        startTimeThreadLocal.set(beginTime);//线程绑定变量(该数据只有当前请求的线程可见)
        return true;//继续流程
    }
    
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, 
Object handler, Exception ex) throws Exception {
        long endTime = System.currentTimeMillis();//2、结束时间
        long beginTime = startTimeThreadLocal.get();//得到线程绑定的局部变量(开始时间)
        long consumeTime = endTime - beginTime;//3、消耗的时间
        if(consumeTime > 500) {//此处认为处理时间超过500毫秒的请求为慢请求
            //TODO 记录到日志文件
            System.out.println(
String.format("%s consume %d millis", request.getRequestURI(), consumeTime));
        }        
    }
}

 

登录检测

在访问某些资源时(如订单页面),需要用户登录后才能查看,因此需要进行登录检测。

 

流程:

1、访问需要登录的资源时,由拦截器重定向到登录页面;

2、如果访问的是登录页面,拦截器不应该拦截;

3、用户登录成功后,往cookie/session添加登录成功的标识(如用户编号);

4、下次请求时,拦截器通过判断cookie/session中是否有该标识来决定继续流程还是到登录页面;

5、在此拦截器还应该允许游客访问的资源。

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, 
Object handler) throws Exception {
    //1、请求到登录页面 放行
    if(request.getServletPath().startsWith(loginUrl)) {
        return true;
    }
        
    //2、TODO 比如退出、首页等页面无需登录,即此处要放行 允许游客的请求
        
    //3、如果用户已经登录 放行  
    if(request.getSession().getAttribute("username") != null) {
        //更好的实现方式的使用cookie
        return true;
    }
        
    //4、非法请求 即这些请求需要登录后才能访问
    //重定向到登录页面
    response.sendRedirect(request.getContextPath() + loginUrl);
    return false;
}

 

提示:推荐能使用servlet规范中的过滤器Filter实现的功能就用Filter实现,因为HandlerInteceptor只有在Spring Web MVC环境下才能使用,因此Filter是最通用的、最先应该使用的。如登录这种拦截器最好使用Filter来实现。

 

from:http://jinnianshilongnian.iteye.com/blog/1670856

分享到:
评论

相关推荐

    Spring Boot Aspect 切面 AOP 拦截器 Interceptor 监控control请求耗时

    首先,我们来看看标题提到的"Interceptor",这是Spring MVC中的一个关键组件。拦截器(HandlerInterceptor)用于在请求被实际处理之前和之后执行一些额外的任务,如记录请求日志、性能监控等。在Spring Boot中,我们...

    springmvc-interceptor

    在Spring MVC框架中,拦截器(Interceptor)是一个至关重要的组件,它允许开发者在请求处理之前、之后或在处理过程中执行自定义逻辑。拦截器可以用于实现日志记录、权限检查、性能统计、事务管理等多种功能,极大地...

    Interceptor框架的实现

    Interceptor框架在软件开发中起着关键作用,尤其是在Java企业级应用中,如Spring AOP(面向切面编程)和各种框架中的拦截器机制。本文将深入探讨Interceptor框架的实现,主要涉及Java代理和反射技术。 首先,理解...

    spring-method-interceptor:Spring Handler Interceptor反思Web方法

    本示例——"spring-method-interceptor"着重展示了如何利用Spring Boot 2.x和Spring Web MVC实现一个自定义的`HandlerInterceptor`,用于拦截带有特定注解的方法调用。 首先,`HandlerInterceptor`是Spring MVC中的...

    Struts2、Spring和Hibernate应用实例

    Struts2、Spring和Hibernate是Java Web开发中的三个核心框架,它们各自负责应用程序的不同层面,协同工作能够构建出高效、可维护的Web应用程序。Struts2是一个MVC框架,主要处理用户界面和业务逻辑的交互;Spring是...

    spring+springmvc+Interceptor+jwt+redis实现sso单点登录.zip

    SSO(Single Sign-On)...综上所述,这个项目通过整合Spring、SpringMVC、Interceptor、JWT和Redis,构建了一个高效、安全的SSO单点登录系统,使得用户在多应用环境中只需一次登录,即可畅游各个应用,提升了用户体验。

    开发Struts 2+Spring应用

    它们各自专注于应用程序的不同方面:Struts 2 主要负责MVC(Model-View-Controller)架构的实现,而Spring则是一个全面的企业级应用框架,提供依赖注入、事务管理、AOP(面向切面编程)等功能。 **Struts 2 框架** ...

    轻量级Java EE企业应用实战(第4版) Struts 2+Spring 4+Hibernate整合开发 光盘 源码

    Struts 2作为MVC(模型-视图-控制器)框架,主要处理用户请求和转发响应,它通过Action和Interceptor实现业务逻辑与展示逻辑的解耦,提供了丰富的插件和定制机制,增强了应用的可扩展性和灵活性。 Spring框架则是一...

    轻量级Java_EE企业应用实战_Struts_2+Spring_3+Hibernate整合开发_第3版

    《轻量级Java_EE企业应用实战_Struts_2+Spring_3+Hibernate整合开发_第3版》这本书深入探讨了在Java EE环境下如何利用轻量级框架Struts 2、Spring 3和Hibernate进行高效的企业级应用开发。这三者结合在一起,形成了...

    精通Java EE Eclipse Struts2 Hibernate Spring整合应用案例 源代码18章 bookstore

    《精通Java EE Eclipse Struts2 Hibernate Spring整合应用案例 源代码18章 bookstore》是针对Java企业级开发的一份重要资源,旨在帮助开发者深入理解并掌握如何在Eclipse环境中集成Struts2、Hibernate和Spring框架...

    Spring Mvc——第一个应用程序

    **Spring MVC —— 第一个应用程序** Spring MVC 是 Spring 框架的一个模块,主要用于构建 Web 应用程序。它提供了一种模型-视图-控制器(MVC)架构,简化了开发过程,使得开发者可以专注于业务逻辑而不必过于关心...

    Java高级框架应用开发案例教程 Struts2+Spring+Hibernate

    Java高级框架应用开发案例教程,主要关注的是Struts2、Spring和Hibernate这三大经典开源框架的整合开发,也称为SSH框架。这些框架是Java企业级应用程序开发中的核心工具,能够帮助开发者实现高效的MVC(Model-View-...

    Struts2+Hibernate+Spring整合开发深入剖析与范例应用06

    Struts2、Hibernate和Spring是Java Web开发中的三大框架,它们各自负责应用程序的不同层面:Struts2处理MVC模式中的视图和控制器,Hibernate管理数据库持久化,而Spring则提供了全面的依赖注入和面向切面编程支持。...

    Struts2+Hibernate+Spring整合开发深入剖析与范例应用05

    Struts2、Hibernate和Spring是Java企业级应用中三大核心框架,它们的整合使用能够构建出高效、可维护且松耦合的Web应用程序。本文将深入剖析这三者如何协同工作,并通过具体范例来应用这些知识。 Struts2作为MVC...

    struts2.0 hibernate3.1 spring2.0 整合应用

    Struts2.0、Hibernate3.1 和 Spring2.0 是经典的Java企业级开发框架,它们的整合应用是构建高效、可维护的企业级Web应用程序的关键。这个实例旨在帮助那些已经有一定基础的开发者提升技能,通过结合这些技术,实现对...

    spring源码分析(1-10)

    7. **Spring AOP中的拦截器调用实现**:Spring AOP使用Advisor和Interceptor实现拦截器链,处理方法调用前后的逻辑。MethodBeforeAdvice、AfterReturningAdvice等接口定义了拦截器的行为。 8. **Spring 驱动...

    mybatis 拦截器 + spring aop切面 + spring事务+ 反射工具类

    在IT行业中,MyBatis、Spring AOP、Spring事务管理和反射工具类是常见的技术栈,它们在构建高效、灵活的企业级应用中起着至关重要的作用。以下是对这些知识点的详细阐述: 1. MyBatis拦截器(MyBatis Interceptor)...

    Java 模拟Interceptor 过程

    Interceptor广泛应用于框架如Spring、MyBatis等,用于实现事务管理、日志记录、权限控制等功能。在本篇文章中,我们将探讨如何在没有现成框架支持的情况下,模拟实现一个简单的Interceptor过程。 首先,我们需要...

    Maven版,Spring mvc, CXF WebService, WebService/Controller Interceptor, Sitemesh

    本项目基于Maven,采用Spring MVC和Apache CXF框架,实现了一个完整的WebService服务器,同时还涉及到了Interceptor(拦截器)和Sitemesh技术。下面我们将深入探讨这些技术及其在项目中的应用。 首先,Maven是一个...

    开发Spring.Struts.Hibernate应用

    Struts 2是一个基于MVC设计模式的Web应用程序框架,它通过提供Action、Result、Interceptor等组件,有效地组织了控制器层。Struts 2与Spring的结合,可以实现对业务对象的管理,利用Spring的DI特性,使得Struts 2的...

Global site tag (gtag.js) - Google Analytics