拦截器一Interceptor
import org.springframework.web.servlet.HandlerInterceptor;
前言
拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是 AOP 的一种实现策略。Java 里的拦截器是动态拦截 action 调用的对象,其依赖的技术就是 Java 的动态代理。
同时也是提供了一种提取 action 中可重用的部分的方式。
拦截器只对 Action 起作用。大部分时候,拦截器方法都是通过代理的方式来调用的。

Spring自定义拦截器的步骤
- 自定义一个实现了Interceptor接口的类,或者继承抽象类AbstractInterceptor。
- 第二步:在配置文件中注册定义的拦截器。
- 第三步:在需要使用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的更多相关文章
- 过滤器(Filter)与拦截器(Interceptor )区别
目录 过滤器(Filter) 拦截器(Interceptor) 拦截器(Interceptor)和过滤器(Filter)的区别 拦截器(Interceptor)和过滤器(Filter)的执行顺序 拦截 ...
- springboot(十七):过滤器(Filter)和拦截器(Interceptor)
概述 在做web开发的时候,过滤器(Filter)和拦截器(Interceptor)很常见,通俗的讲,过滤器可以简单理解为“取你所想取”,忽视掉那些你不想要的东西:拦截器可以简单理解为“拒你所想拒”, ...
- SpringMVC的拦截器(Interceptor)和过滤器(Filter)的区别与联系
摘自: http://blog.csdn.net/xiaoyaotan_111/article/details/53817918 一 简介 (1)过滤器: 依赖于servlet容器.在实现上基于函数回 ...
- 过滤器(Filter)与拦截器(Interceptor)区别
过滤器(Filter)与拦截器(Interceptor)区别 过滤器(Filter) Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,主要的用途 ...
- java拦截器(Interceptor)学习笔记
1,拦截器的概念 java里的拦截器是动态拦截Action调用的对象,它提供了一种机制可以使开发者在一个Action执行的前后执行一段代码,也可以在一个Action执行前阻止其执行,同时也提供了 ...
- Hadoop生态圈-Flume的组件之自定义拦截器(interceptor)
Hadoop生态圈-Flume的组件之自定义拦截器(interceptor) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客只是举例了一个自定义拦截器的方法,测试字节传输速 ...
- 1.5(Spring MVC学习笔记) 拦截器(Interceptor)
一.拦截器 1.1拦截器简介 Spring中的拦截器类似Servlet中的过滤器(Filter),主要用于拦截用户请求, 并进行一定的处理操作(如验证权限.记录日志.设置编码方式等). 1.2拦截器实 ...
- Struts之 拦截器配置 ( Interceptor )
struts2体系结构的核心就是拦截器. 以链式执行,对真正要执行的方法(execute())进行拦截.首先执行Action配置的拦截器,在Action和Result执行之后,拦截器再一次执行(与先前 ...
- Kafka producer拦截器(interceptor)
Kafka producer拦截器(interceptor) 拦截器原理 Producer拦截器(interceptor)是在Kafka 0.10版本被引入的,主要用于实现clients端的定制化控制 ...
- Spring Boot 2.X(九):Spring MVC - 拦截器(Interceptor)
拦截器 1.简介 Spring MVC 中的拦截器(Interceptor)类似于 Servlet 开发中的过滤器 Filter,它主要用于拦截用户请求并作相应的处理,它也是 AOP 编程思想的体现, ...
随机推荐
- oracle查询重复数据出现次数
话不多数上代码: 我在Oracle数据库查数据,发现重复数据,于是我想把重复条数以及具体数据查出来: 下面是数据 然后我需要知道重复多少条 (重复十条,也就是有五条数据相同) SQL: select ...
- org.springframework.web.servlet.DispatcherServlet异常
org.springframework.web.servlet.DispatcherServlet: No mapping found for HTTP request with URI [/] in ...
- Table边框合并
<style> table, table tr th, table tr td { border: 1px solid #0094ff; } table { width: 200px; m ...
- 【SQL】Mysql常用sql语句记录
1.创建用户.赋予权限 CREATE DATABASE scadm DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; CREATE USER 's ...
- 首次公开!单日600PB的计算力--阿里巴巴EB级大数据平台的进击
MaxCompute作为阿里巴巴的主力计算平台,在2018年的双11中,再次不负众望,经受住了双11期间海量数据和高并发量的考验.为集团的各条业务线提供了强劲的计算力,不愧是为阿里巴巴历年双11输送超 ...
- Yii2数据库操作 事务
Yii2 DAO http://blog.csdn.net/hzqghost/article/details/44116039
- myeclipse 启动卡住的解决办法
myeclipse 启动卡住的解决办法 今天启动myeclipse突然卡住,CPU一直占用,启动任务管理器强制关闭.重启myeclipse,重启电脑都不能够解决. 上网查找,在工程路径(工作空间的路径 ...
- Linux之nginx-uwagi-django 搭建
1. nginx 1) 使用官方Nginx yum源 [root@nginx ~]# vim /etc/yum.repos.d/nginx.repo [nginx] name=nginx repo b ...
- 牛客 Fruit Ninja 2018 ACM 上海大都会赛 (随机化算法)
题目链接:Fruit Ninja 比赛链接:2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛 题目描述 Fruit Ninja is a juicy action game enjoyed ...
- vant实现三级联动
首先要在vant 框架里边 复制一下 省市区的 地址数据在这里下载eare.js 格式 : var address = { province_list: { 110000: '北京市', }, ...