import org.springframework.web.servlet.HandlerInterceptor;

前言

拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是 AOP 的一种实现策略。Java 里的拦截器是动态拦截 action 调用的对象,其依赖的技术就是 Java 的动态代理。

同时也是提供了一种提取 action 中可重用的部分的方式。

拦截器只对 Action 起作用。大部分时候,拦截器方法都是通过代理的方式来调用的。

Spring自定义拦截器的步骤

  1. 自定义一个实现了Interceptor接口的类,或者继承抽象类AbstractInterceptor。
  2. 第二步:在配置文件中注册定义的拦截器。
  3. 第三步:在需要使用Action中引用上述定义的拦截器,为了方便也可以将拦截器定义为默认的拦截器,这样在不加特殊说明的情况下,所有的Action都被这个拦截器拦截。

用Spring实现拦截器Interceptor的拦截功能

在Spring框架之中,我们要想实现拦截器的功能,主要通过两种途径,第一种是实现HandlerInterceptor接口,第二种是实现WebRequestInterceptor接口。

HandlerInterceptor

在实际应用中,我们一般都是通过实现HandlerInterceptor接口或者继承HandlerInterceptorAdapter抽象类,复写preHandle()postHandle()afterCompletion()这 3 个方法来对用户的请求进行拦截处理的。

1.preHandle

preHandle(HttpServletRequest request, HttpServletResponse response, Object handle)

preHandle方法都会在Controller方法调用之前调用。可以在这个方法中进行一些前置初始化操作或者是对当前请求做一个预处理。

Spring MVC 中的Interceptor是链式调用的。

该方法的返回值是布尔(Boolean)类型的,当它返回为false时,表示请求结束,后续的Interceptor和控制器(Controller)都不会再执行;当返回值为true时,就会继续调用下一个Interceptor的preHandle方法,如果已经是最后一个Interceptor的时候,就会是调用当前请求的控制器中的方法。

2.postHandle

postHandle(HttpServletRequest request, HttpServletResponse response, Object handle, ModelAndView modelAndView)

在Controller的方法调用之后执行

只能在当前所属的Interceptor的preHandle方法的返回值为true的时候,才能被调用。

它会在DispatcherServlet进行视图返回渲染之前被调用,所以我们可以在这个方法中对控制器处理之后的ModelAndView对象进行操作。

先声明的Interceptor的postHandle方法会后执行。

3.afterCompletion

afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handle, Exception ex)

Interceptor的preHandle方法的返回值为true时才会执行。

因此,该方法将在整个请求结束之后,也就是在DispatcherServlet渲染了对应的视图之后执行.

这个方法的主要作用是用于进行资源清理的工作。

拦截器示例(登陆拦截)

public class LoginInterceptor extends HandlerInterceptorAdapter{

    /**
* 在业务处理器处理请求之前被调用
* 如果返回false
* 从当前的拦截器往回执行所有拦截器的afterCompletion(),再退出拦截器链
* 如果返回true
* 执行下一个拦截器,直到所有的拦截器都执行完毕
* 再执行被拦截的Controller
* 然后进入拦截器链,
* 从最后一个拦截器往回执行所有的postHandle()
* 接着再从最后一个拦截器往回执行所有的afterCompletion()
*/
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception { String username = (String)request.getSession().getAttribute("user");
if(username == null){
//跳转到login页面
request.getRequestDispatcher("/login.jsp").forward(request, response);
return false;
}else
return true;
} /**
* 在业务处理器处理请求执行完成后,生成视图之前执行的动作
* 可在modelAndView中加入数据,比如当前时间
*/
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception { if(modelAndView != null){ //加入当前时间
modelAndView.addObject("name", "小明");
}
} /**
* 在DispatcherServlet完全处理完请求后被调用,可用于清理资源等
*
* 当有拦截器抛出异常时,会从当前拦截器往回执行所有的拦截器的afterCompletion()
*/
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception { } }

配置拦截器(applicationContext.xml)

1.概念

  • Join Point,表示“连接点”,它是程序运行中的某个阶段点,比如方法的调用、异常的抛出等;
  • Advice,表示“通知”,它是某个连接点所采用的处理逻辑,也就是向连接点注入的代码;
  • Pointcut,表示“切入点”,它是“连接点”的集合,是程序中需要注入Advice的位置的集合,指明Advice要在什么样的条件下才能被触发;
  • Advisor,它是Pointcut和Advice的配置器,包括Pointcut和Advice,是将Advice注入程序中Pointcut位置的代码。

2.XML 配置文件的声明

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">

3.mvc:interceptors标签配置拦截器

<mvc:interceptors>
<!-- 直接定义在 mvc:interceptors 下面的 Interceptor 将拦截所有的请求。先声明的拦截器先执行,后声明的拦截器后执行 -->
<bean class="com.interceptor.AllInterceptor"/>
<bean class="com.interceptor.ContextInterceptor"/>
<mvc:interceptor>
<mvc:mapping path="/demo/hello.do"/>
<mvc:exclude-mapping path="/login"/>
<!-- 定义在 mvc:interceptor 下面的 Interceptor,表示对特定的请求进行拦截 -->
<bean class="com.interceptor.LoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>

4.aop切面配置拦截器

<bean id="WrongCodeInterceptor" class="com.interceptor.WrongCodeInterceptor">
<property name="userName" value="小明"></property>
</bean> <bean id="loginInterceptor" class="com.interceptor.LoginInterceptor">
<property name="excludePackages">
<list>
<value>com.user</value>
<value>com.order</value>
</list>
</property>
</bean> <aop:config>
<aop:advisor advice-ref="WrongCodeInterceptor" pointcut="execution(* com.*.demo..*.*(..)) " />
<aop:advisor advice-ref="loginInterceptor" pointcut="execution(* com.*.demo..*.*(..))" />
</aop:config>

5.Spring Boot不需要在xml中配置,需要注册拦截器

编写配置类

@Configuration
public class WebConfig implements WebMvcConfigurer { @Bean
public LoginInterceptor sessioninterceptor() {
return new LoginInterceptor();
} /**
* 配置拦截器
*
* @param registry
* @author yuqingquan
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 添加拦截器
registry.addInterceptor(sessioninterceptor()).addPathPatterns("/**")
.excludePathPatterns("/**/login")
.order(1); //指定执行顺序,数值越小越优先
}
}

SpringMVC 拦截器原理

https://www.cnblogs.com/loveer/p/11577949.html

拦截器一Interceptor的更多相关文章

  1. 过滤器(Filter)与拦截器(Interceptor )区别

    目录 过滤器(Filter) 拦截器(Interceptor) 拦截器(Interceptor)和过滤器(Filter)的区别 拦截器(Interceptor)和过滤器(Filter)的执行顺序 拦截 ...

  2. springboot(十七):过滤器(Filter)和拦截器(Interceptor)

    概述 在做web开发的时候,过滤器(Filter)和拦截器(Interceptor)很常见,通俗的讲,过滤器可以简单理解为“取你所想取”,忽视掉那些你不想要的东西:拦截器可以简单理解为“拒你所想拒”, ...

  3. SpringMVC的拦截器(Interceptor)和过滤器(Filter)的区别与联系

    摘自: http://blog.csdn.net/xiaoyaotan_111/article/details/53817918 一 简介 (1)过滤器: 依赖于servlet容器.在实现上基于函数回 ...

  4. 过滤器(Filter)与拦截器(Interceptor)区别

    过滤器(Filter)与拦截器(Interceptor)区别 过滤器(Filter) Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,主要的用途 ...

  5. java拦截器(Interceptor)学习笔记

    1,拦截器的概念    java里的拦截器是动态拦截Action调用的对象,它提供了一种机制可以使开发者在一个Action执行的前后执行一段代码,也可以在一个Action执行前阻止其执行,同时也提供了 ...

  6. Hadoop生态圈-Flume的组件之自定义拦截器(interceptor)

    Hadoop生态圈-Flume的组件之自定义拦截器(interceptor) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客只是举例了一个自定义拦截器的方法,测试字节传输速 ...

  7. 1.5(Spring MVC学习笔记) 拦截器(Interceptor)

    一.拦截器 1.1拦截器简介 Spring中的拦截器类似Servlet中的过滤器(Filter),主要用于拦截用户请求, 并进行一定的处理操作(如验证权限.记录日志.设置编码方式等). 1.2拦截器实 ...

  8. Struts之 拦截器配置 ( Interceptor )

    struts2体系结构的核心就是拦截器. 以链式执行,对真正要执行的方法(execute())进行拦截.首先执行Action配置的拦截器,在Action和Result执行之后,拦截器再一次执行(与先前 ...

  9. Kafka producer拦截器(interceptor)

    Kafka producer拦截器(interceptor) 拦截器原理 Producer拦截器(interceptor)是在Kafka 0.10版本被引入的,主要用于实现clients端的定制化控制 ...

  10. Spring Boot 2.X(九):Spring MVC - 拦截器(Interceptor)

    拦截器 1.简介 Spring MVC 中的拦截器(Interceptor)类似于 Servlet 开发中的过滤器 Filter,它主要用于拦截用户请求并作相应的处理,它也是 AOP 编程思想的体现, ...

随机推荐

  1. cd 切换

    切换

  2. java笔试题大全之IO流常见选择题

    1.下面哪个流类属于面向字符的输入流()选择一项)A. BufferedWriterB. FileInputStreamC. ObjectInputStreamD. InputStreamReader ...

  3. nodejs模块——fs模块 使用fs.write读文件

    fs.write() fs.read(fd,buffer,offset,length[,position],callback(err,bytesWritten,buffer))接收6个参数. 参数说明 ...

  4. ES6(阮一峰)对象的扩展

    1.属性的简洁表示法 允许直接写入变量和函数,作为对象的属性和方法. const foo = 'bar'; const baz = {foo};//等同于 const baz = {foo : &qu ...

  5. PHP水仙花数的实现

    php水仙花数是什么? 水仙花数是指一个 n 位数 ( n≥3 ),它的每个位上的数字的 n 次幂之和等于它本身.(例如:1^3 + 5^3 + 3^3 = 153)三位的水仙花数共有4个:153,3 ...

  6. HIVE的Shell操作

    1.Hive支持的一些命令 退出使用quit或exit离开交互式外壳. set key = value使用它来设置特定配置变量的值. 这里要注意的一件事是,如果您对变量名拼写错误,cli将不会显示错误 ...

  7. git stash 保存和恢复进度

    1. stash当前修改 git stash会把所有未提交的修改(包括暂存的和非暂存的)都保存起来,用于后续恢复当前工作目录. 比如下面的中间状态,通过git stash命令推送一个新的储藏,当前的工 ...

  8. hive建模方法

    转自:https://www.jianshu.com/p/8378b80e4b21 概述数据仓库这个概念是由 Bill Inmon 所提出的,其功能是将组织通过联机事务处理(OLTP)所积累的大量的资 ...

  9. java_monitor

    转载自http://blog.sina.com.cn/s/blog_9385f6d90101dbqy.html java会为每个object对象分配一个monitor,当某个对象的同步方法(synch ...

  10. 2、使用siege进行服务端性能测试

    先查看siege帮助 输入siege -h 翻译一下常用命令 -c 指定并发数 -r 指定重复次数 -d 指定请求的延迟时间,注意每个请求间随机延迟 -f 指定url列表,可以一次给多个地址加压 -t ...