spring mvc拦截器
2016-12-10 22:34
357 查看
Java里的拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可以提取action中可重用部分的方式。在AOP(Aspect-Oriented Programming)中拦截器用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。
spring mvc中的拦截器概念和struts2的拦截器概念是一样的。这里先用struts2的拦截器原理来理解。
大部分时候,拦截器方法都是通过代理的方式来调用的。Struts 2的拦截器实现相对简单。当请求到达Struts 2的ServletDispatcher时,Struts 2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表(list),最后一个一个地调用列表中的拦截器。Struts2拦截器是可插拔的,拦截器是AOP的一种实现。Struts2拦截器栈就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,Struts2拦截器链中的拦截器就会按其之前定义的顺序被调用。
spring mvc中自定义一个拦截器需要三步:
1. 自定义拦截器,这个拦截器实现HandlerInterceptor接口。
2. 在spring-mvc.xml配置文件中配置拦截器。
3. 在自定义拦截器中做拦截处理。
HandlerInterceptor需要实现3个方法,preHandle()方法在调用controller前就调用,postHandle(),afterCompletion()在调用controller之后调用。在preHandle()方法中,如果返回true,那么执行下一个拦截器,如果返回false,那么不执行拦截器。
mvc:mapping标签的path属性中,配置的拦截路径,/**包括路径的子路劲,如果是/admin*拦截的是/admin/add, /admin/list等,/admin/user/add不被拦截。
在ide打上断点,浏览器输入url,就会进入这个拦截器里面来。这里有个思考题:如果被拦截,能否到达指定的页面?答案是:使用HttpServletResponse或者HttpServletRequest可以实现转发或者重定向。
在拦截器中,定义一个List的变量这个变量默认哪些地址不需要拦截,赋值是通过配置文件中
中设置,当前端访问url时,在进入controller方法前,先来到登录拦截器的preHandle()方法,这个方法的处理逻辑是:先从session中获取登录用户名,如果session中存在用户,那么通过。如果session中没有用户名,但是url后缀在白名单中,也让它通过,只有那些既没有登录过,也不是白名单地址在这里被强制返回到登录页面。
1.拦截器是基于java反射机制的,而过滤器是基于函数回调的。
2.过滤器依赖于servlet容器,而拦截器不依赖于servlet容器。
3.拦截器只对action起作用,而过滤器几乎可以对所有请求起作用。
4.拦截器可以访问action上下文、值栈里的对象,而过滤器不能。
5.在action的生命周期里,拦截器可以多起调用,而过滤器只能在容器初始化时调用一次。
spring mvc中的拦截器概念和struts2的拦截器概念是一样的。这里先用struts2的拦截器原理来理解。
大部分时候,拦截器方法都是通过代理的方式来调用的。Struts 2的拦截器实现相对简单。当请求到达Struts 2的ServletDispatcher时,Struts 2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表(list),最后一个一个地调用列表中的拦截器。Struts2拦截器是可插拔的,拦截器是AOP的一种实现。Struts2拦截器栈就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,Struts2拦截器链中的拦截器就会按其之前定义的顺序被调用。
spring mvc中自定义一个拦截器需要三步:
1. 自定义拦截器,这个拦截器实现HandlerInterceptor接口。
2. 在spring-mvc.xml配置文件中配置拦截器。
3. 在自定义拦截器中做拦截处理。
实现拦截器
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; public class MyInterceptor implements HandlerInterceptor { /** * 在DispatcherServlet处理后执行,清理工作 */ public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object object, Exception exception) throws Exception { System.out.println("-----------------------清理工作------------------------"); } public void postHandle(HttpServletRequest request, HttpServletResponse response, Object object, ModelAndView modelAndView) throws Exception { System.out.println("处理请求"); } /** * 在请求方法处理前执行 */ public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object object) throws Exception { System.out.println("---------------------拦截器之前先拦截--------------------"); return true; } }
HandlerInterceptor需要实现3个方法,preHandle()方法在调用controller前就调用,postHandle(),afterCompletion()在调用controller之后调用。在preHandle()方法中,如果返回true,那么执行下一个拦截器,如果返回false,那么不执行拦截器。
配置拦截器
<!-- 拦截器配置 --> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**" /> <bean class="com.shizongger.ssm.controller.MyInterceptor" /> </mvc:interceptor> </mvc:interceptors>
mvc:mapping标签的path属性中,配置的拦截路径,/**包括路径的子路劲,如果是/admin*拦截的是/admin/add, /admin/list等,/admin/user/add不被拦截。
在ide打上断点,浏览器输入url,就会进入这个拦截器里面来。这里有个思考题:如果被拦截,能否到达指定的页面?答案是:使用HttpServletResponse或者HttpServletRequest可以实现转发或者重定向。
拦截器的应用:登录拦截器
web开发中,只要有登录用户这一模块几乎都需要权限验证。这里先配置一个登陆拦截器,默认登录地址不拦截,登录过的用户也不需要拦截,每个url都允许通过。只有未登录的用户,直接访问非登录地址,这是不允许的是,需要拦截。import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; public class LoginInterceptor implements HandlerInterceptor { private List<String> allawedPass; public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object object, Exception exception) throws Exception { } public void postHandle(HttpServletRequest request, HttpServletResponse response, Object object, ModelAndView mav) throws Exception { } public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object object) throws Exception { String url = request.getRequestURL().toString().trim(); String loginName = (String) request.getSession().getAttribute("loginName"); if(loginName != null) { return true; } for(String temp : allawedPass) { if(url.endsWith(temp)) { return true; } } response.sendRedirect(request.getContextPath() + "/user/loginUI"); return false; } public void setAllawedPass(List<String> allawedPass) { this.allawedPass = allawedPass; } }
<!-- 拦截器配置 --> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**" /> <bean class="com.shizongger.ssm.controller.MyInterceptor" /> </mvc:interceptor> <mvc:interceptor> <mvc:mapping path="/**" /> <bean class="com.shizongger.ssm.controller.LoginInterceptor"> <property name="allawedPass"> <list> <value>/user/loginUI</value> <value>/user/login</value> </list> </property> </bean> </mvc:interceptor> </mvc:interceptors>
在拦截器中,定义一个List的变量这个变量默认哪些地址不需要拦截,赋值是通过配置文件中
<list> <value>/user/loginUI</value> <value>/user/login</value> </list>
中设置,当前端访问url时,在进入controller方法前,先来到登录拦截器的preHandle()方法,这个方法的处理逻辑是:先从session中获取登录用户名,如果session中存在用户,那么通过。如果session中没有用户名,但是url后缀在白名单中,也让它通过,只有那些既没有登录过,也不是白名单地址在这里被强制返回到登录页面。
拦截器与过滤器区别
过滤器可以简单理解为“取你所想取”,忽视掉那些你不想要的东西;拦截器可以简单理解为“拒你所想拒”,关心你想要拒绝掉哪些东西,比如一个BBS论坛上拦截掉敏感词汇。1.拦截器是基于java反射机制的,而过滤器是基于函数回调的。
2.过滤器依赖于servlet容器,而拦截器不依赖于servlet容器。
3.拦截器只对action起作用,而过滤器几乎可以对所有请求起作用。
4.拦截器可以访问action上下文、值栈里的对象,而过滤器不能。
5.在action的生命周期里,拦截器可以多起调用,而过滤器只能在容器初始化时调用一次。
相关文章推荐
- Spring 框架知识知识总结
- 各种排序算法的java实现及时间、空间复杂度、稳定程度总结
- Java中的IO浅析(一)
- Java语言的关键字(保留字)
- Action开发、通配符、路径问题和struts中常量用法
- Spring学习
- 学习struts2的笔记--顺便学习博客写法---struts2的一些拦截器(部分)
- 解析XML文件的4种主流方法介绍
- (6)Spring Boot datasource - mysql【从零开始学Spring Boot】
- Spring MVC结果转换
- (5)全局异常捕捉【从零开始学Spring Boot】
- Java编程思想-java中的并发(四)
- Java编程思想-java中的并发(三)
- Java编程思想-java中的并发(二)
- Java编程思想-java中的并发(一)
- Spring 对JDBC的支持(JdbcTemplate)
- Java编程思想-注解
- JVA模拟学生管理系统
- 如何在Eclipse中自定义类似syso的快捷代码模板【自动补全】
- Java编程思想-IO系统