`
kingj
  • 浏览: 425639 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

spring interceptor

 
阅读更多

  SpringMVC的拦截器不同于Spring的拦截器,SpringMVC具有统一的入口DispatcherServlet,所有的请求都通过DispatcherServlet,所以只需要在DispatcherServlet上做文章即可,DispatcherServlet也没有代理,同时SpringMVC管理的Controller也不有代理。

    一、Servlet Filter与Spring interceptor的执行顺序

    Filter有顺序吗?我们怎么控制filter的执行顺序。通过Tomcat的代码分析,servlet在Filter执行完成后才调用,如有多个filter怎么控制执行顺序,首先会想到在web.xml配置某个参数,例如order之类的,但查找一下一番,servlet并没有这个参数。试试filter Mapping的配置的先后顺序,果然有效,原来filter的执行顺序就考filter mapping在web.xml中的顺序。

    spring interceptor也是这样的执行顺序,不过interceptor多一个配置参数order通过他也可以来实现interceptor的执行顺序。很多应用场景中,执行顺序还是重要的,比如cache和transaction interceptor的执行顺序,很显然cache应该在transaction之前,这样发现命中了就不用打开事务,如果transaction在前,每次都打开事务即使cache命中,这是一个无谓东动作。

    二、利用springMVC的interceptor实现页面性能监控(Filter亦可)

    调优第一步,找出耗时比较长的页面进行优化。利用interceptor能轻易搞定。interceptor提供了preHandle和postHandle以及afterCompletion三个方法。preHandle调用controller具体方法之前调用,postHandle完成具体方法之后调用,afterCompletion完成对页面的render以后调用,至此整个页面渲染完成。也就是说我们在preHandle记录开始的时间,在afterCompletion记录结束的时间,就可或者整个页面生成的时间。Spring自带StopWatch工具类来实现时间跟踪,关键一点interceptor不是线程安全 的。我们需要借助threadlocal来实现线程安全

    @Override

    public boolean preHandle(HttpServletRequest request,

    HttpServletResponse response, Object handler) throws Exception {

    if(usePerformance){

    StopWatch stopWatch = new StopWatch(handler.toString());

    stopWatchLocal.set(stopWatch);

    stopWatch.start(handler.toString());

    }

    return true;

    }

    @Override

    public void afterCompletion(HttpServletRequest request,

    HttpServletResponse response, Object handler, Exception ex)

    throws Exception {

    if(usePerformance){

    StopWatch stopWatch = stopWatchLocal.get();

    stopWatch.stop();

    String currentPath = request.getRequestURI();

    String queryString  = request.getQueryString();

    queryString = queryString == null ? "":"?" + queryString;

    log.info("access url path:" + currentPath + queryString +  " |time:" + stopWatch.getTotalTimeMillis());

    stopWatchLocal.set(null);

    }

    }

    如果你没有使用springMVC可以使用filter来完成:

    stopWatch.start();

    doFilterChain();

    stopWatch.stop();

    三、SpringMVC 拦截器实现分析

    SpringMVC的拦截器不同于Spring的拦截器,SpringMVC具有统一的入口DispatcherServlet,所有的请求都通过DispatcherServlet,所以只需要在DispatcherServlet上做文章即可,DispatcherServlet也没有代理,同时SpringMVC管理的Controller也不有代理。哪不难想到我们在执行controller之前做某些动作,执行完毕做某些动作,render完成做某些动作。SpringMVC的拦截器对应提供了三个preHandle,postHandle,afterCompletion方法。只需在三个方法内写我们需要的逻辑就行,多了都是废话,还是代码实在。

    HandlerInterceptor[] interceptors = mappedHandler.getInterceptors();

    if (interceptors != null) {

    for (int i = 0; i < interceptors.length; i++) {

    HandlerInterceptor interceptor = interceptors[i];

    //ha.handle是调用具体的controller在此之前执行preHandle                      if (!interceptor.preHandle(processedRequest, response, mappedHandler.getHandler())) {

    triggerAfterCompletion(mappedHandler, interceptorIndex, processedRequest, response, null);

    return;

    }

    interceptorIndex = i;

    }

    }

    // Actually invoke the handler.

    mv = ha.handle(processedRequest, response, mappedHandler.getHandler());

    完成调用之后,调用render(),最后执行afterCompletion()。

    if (interceptors != null) {

    for (int i = interceptors.length - 1; i >= 0; i--) {

    HandlerInterceptor interceptor = interceptors[i];

    interceptor.postHandle(processedRequest, response, mappedHandler.getHandler(), mv);

    }

    }

    }

    catch (ModelAndViewDefiningException ex) {

    logger.debug("ModelAndViewDefiningException encountered", ex);

    mv = ex.getModelAndView();

    }

    catch (Exception ex) {

    Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);

    mv = processHandlerException(processedRequest, response, handler, ex);

    errorView = (mv != null);

    }

    // Did the handler return a view to render?

    if (mv != null && !mv.wasCleared()) {

    render(mv, processedRequest, response);

    if (errorView) {

    WebUtils.clearErrorRequestAttributes(request);

    }

    }

    else {

    if (logger.isDebugEnabled()) {

    logger.debug("Null ModelAndView returned to DispatcherServlet with name '" + getServletName() +

    "': assuming HandlerAdapter completed request handling");

    }

    }

    // Trigger after-completion for successful outcome.

    triggerAfterCompletion(mappedHandler, interceptorIndex, processedRequest, response, null);

分享到:
评论

相关推荐

    spring boot加入拦截器Interceptor过程解析

    "Spring Boot 中的拦截器Interceptor 配置和使用详解" Spring Boot 框架提供了拦截器Interceptor机制,用于在请求处理前、后执行某些操作。拦截器Interceptor可以用来实现身份验证、日志记录、缓存、权限控制等...

    63丨职责链模式(下):框架中常用的过滤器、拦截器是如何实现的?1

    **Spring Interceptor**是Spring框架中的拦截器,主要用于AOP(面向切面编程),在方法调用前、后以及异常处理时介入,可以用于事务管理、性能监控、日志记录等。与Servlet Filter不同,Spring Interceptor是在...

    62丨职责链模式(上):如何实现可灵活扩展算法的敏感信息过滤框架?1

    这种模式常用于框架开发,如Servlet Filter和Spring Interceptor,为开发者提供了无需修改框架源码即可扩展功能的能力。 在代码实现上,职责链模式通常有两种常见的形式。一种是通过继承实现,定义一个抽象处理器类...

    java项目源码之UrlRewriter Java v2.0 RC1-urlrewriterjava.rar

    基于 Servlet Filter 或者 Spring Interceptor 等技术,实现对请求的拦截和处理。 在请求到达服务器之前或者返回给客户端之前,通过拦截器对 URL 进行重写操作。 灵活的重写规则: 提供灵活的 URL 重写规则配置,...

    spring boot jwt Interceptor 例子

    spring boot jwt 和 interceptor的例子。 其中jwt的例子网上有很多,但是都是要数据库支持,这个只是用假数据模拟,不需要数据库支持。另外还有一个拦截器的简单例子。已经在sts 4 测试通过。

    springAOP与Interceptor

    SpringAOP与SpringMVC拦截器两种方式实现权限管控,前台xml读取配置根据登录用户判断button是否enable

    88丨开源实战五(中):如何利用职责链与代理模式实现MyBatisPlugin?1

    MyBatisPlugin的设计与Servlet Filter和Spring Interceptor有相似之处,它们都致力于提升框架的可扩展性。然而,MyBatisPlugin在实现上稍有不同,它结合了动态代理模式来构建职责链。动态代理模式允许在运行时创建...

    springmvc-interceptor

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

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

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

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

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

    Interceptor框架的实现

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

    详解利用SpringMVC拦截器控制Controller返回值

    在Spring MVC框架中,拦截器(Interceptor)是一个强大的工具,它可以对HTTP请求进行预处理(preHandle)、后处理(postHandle)以及清理工作(afterCompletion)。在这个场景中,我们利用拦截器来控制Controller...

    spring源码分析(1-10)

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

    mybatis interceptor

    MyBatis Interceptor 是 MyBatis 框架中的一个重要组件,它允许我们在 SQL 执行过程中插入自定义的行为。在本例中,我们探讨的是如何使用 MyBatis ...此外,还可以结合 Spring 的 AOP 实现更复杂的拦截逻辑。

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

    本项目利用Spring、SpringMVC、Interceptor拦截器、JWT(JSON Web Token)以及Redis来实现SSO系统。下面将详细解释这些关键组件及其在SSO中的作用。 1. **Spring框架**: Spring是Java企业级应用开发的基石,提供...

    Java 模拟Interceptor 过程

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

    springsecurity学习笔记

    3. **Filter Security Interceptor (FSI) 和 Access Decision Manager (ADM)**:FSI是Spring Security的核心组件,负责拦截HTTP请求并进行安全检查。ADM则负责决定是否允许访问资源,它可以根据多个投票器(例如...

    Spring Boot 编写Servlet、Filter、Listener、Interceptor的方法

    Spring Boot 编写Servlet、Filter、Listener、Interceptor的方法 标题:Spring Boot 编写Servlet、Filter、Listener、Interceptor的方法 描述:Spring Boot 中如何定义过滤器、监听器和拦截器,对 Spring Boot ...

    spring-security Jar包

    3. **过滤器链**:Spring Security 的核心是Filter Security Interceptor(过滤器安全拦截器)和Access Decision Manager(访问决策管理器)。过滤器链处理HTTP请求,进行身份验证和授权检查,而访问决策管理器根据...

Global site tag (gtag.js) - Google Analytics