【Maven+SSM】Springmvc的统一处理之拦截器
来源:互联网 发布:民族政策知乎 编辑:程序博客网 时间:2024/06/03 19:51
前言:
拦截器的使用场景:
程序中的所有请求的共同问题。
1、例如上一篇文章的乱码问题。本文最后会讲到乱码问题的解决。
2、例如解决权限验证的问题。本文最后也会提到。
拦截器与过滤器的区别:
过滤器基于Servlet容器,基于回调函数,范围大。
拦截器Interceptor依赖于框架,基于反射,只过滤请求。
正文:
一、写一个拦截器Interceptor
package interceptor;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;public class TestInterceptor implements HandlerInterceptor{@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {System.out.println("---------preHandle--------");return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {System.out.println("---------postHandle--------");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throws Exception {System.out.println("---------afterCompletion--------");}}
其中preHandle返回true说明不中断请求,否则中断请求。
二、注册到SpringMVC。
在springmvc-servlet.xml中配置拦截器
<!-- 注册拦截器 --><mvc:interceptors><bean class="interceptor.TestInterceptor"></bean></mvc:interceptors>默认对所有走controller的请求拦截。
三、请求测试:
会按照如下顺序打印:
---------preHandle--------
略
---------postHandle--------
略
---------afterCompletion--------
因此,可见,三个方法的调用时机。
preHandle请求被处理之前。
postHandle请求被处理之后。
afterCompletion请求结束之后调用。
四、修改拦截规则:
仅仅针对部分请求拦截。修改在springmvc-servlet.xml中拦截器如下:
<!-- 注册拦截器 --><mvc:interceptors><mvc:interceptor><!-- 配置拦截规则 --><mvc:mapping path="/*.do"/><bean class="interceptor.TestInterceptor"></bean></mvc:interceptor></mvc:interceptors>只针对/*.do结尾的路径拦截。可以测试一下。略。
五、通过拦截器修改请求跳转及参数。
跳转页面的请求修改,拦截器如下:让请求处理之后跳转springmvc指定路径下的login.jsp,而不是原来的页面。
package interceptor;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;public class TestInterceptor implements HandlerInterceptor{@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {System.out.println("---------preHandle--------");return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {System.out.println("---------postHandle--------");modelAndView.setViewName("/login");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throws Exception {System.out.println("---------afterCompletion--------");}}此方式仅仅针对原本就是跳转页面的请求有效。如果是responseBody的json返回请求则报错。
同样可通过修改ModelAndView修改传递的参数。例如:
@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {System.out.println("---------postHandle--------");modelAndView.setViewName("/login");modelAndView.addObject("msg", "我已经被拦截修改了");}这样在页面中就会获得msg这个字段。如果之前有这个字段,则会被拦截器替换。
六、多个拦截器的拦截顺序。
<!-- 注册拦截器 --><mvc:interceptors><!-- <mvc:interceptor>配置拦截规则<mvc:mapping path="/*.do"/><bean class="interceptor.TestInterceptor"></bean></mvc:interceptor> --><bean class="interceptor.TestInterceptor"></bean><bean class="interceptor.OtherInterceptor"></bean></mvc:interceptors>执行顺序如何?原因,其实就是一个围绕方法的代理模式。
---------preHandle-----------------preHandle2--------略---------postHandle2-----------------postHandle--------略---------afterCompletion2-----------------afterCompletion--------
七、拦截器的其他实现方式。
package interceptor;import org.springframework.ui.ModelMap;import org.springframework.web.context.request.WebRequest;import org.springframework.web.context.request.WebRequestInterceptor;public class WebInterceptor implements WebRequestInterceptor{@Overridepublic void preHandle(WebRequest request) throws Exception {// 区别,没有返回值}@Overridepublic void postHandle(WebRequest request, ModelMap model) throws Exception {// TODO Auto-generated method stub}@Overridepublic void afterCompletion(WebRequest request, Exception ex) throws Exception {// TODO Auto-generated method stub}}
区别:不能中断请求。
八、通过拦截器对乱码问题的解决。
不仅可以如下处理请求的乱码,也可以处理响应请求的乱码问题。
package interceptor;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;public class TestInterceptor implements HandlerInterceptor{@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {System.out.println("---------preHandle--------");//处理中文请求乱码问题request.setCharacterEncoding("UTF-8");return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {System.out.println("---------postHandle--------");//modelAndView.setViewName("/login");//modelAndView.addObject("msg", "我已经被拦截修改了");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throws Exception {System.out.println("---------afterCompletion--------");}}
九、拦截器解决权限验证的问题。
package interceptor;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;public class OtherInterceptor implements HandlerInterceptor{@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {System.out.println("---------preHandle2--------");if (request.getSession().getAttribute("user")==null) {//回到登陆页面request.getRequestDispatcher("/login.jsp").forward(request, response);;return false;}else {return true;}}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {System.out.println("---------postHandle2--------");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throws Exception {System.out.println("---------afterCompletion2--------");}}
阅读全文
0 0
- 【Maven+SSM】Springmvc的统一处理之拦截器
- 【Maven+SSM】Springmvc的统一处理之中文乱码问题
- 前后端分离 SSM 统一异常处理 解决404不被拦截的问题
- SpringMVC之异常统一处理
- ssm--之拦截器
- springMVC的统一异常处理
- springmvc统一的异常处理
- springmvc拦截器处理
- axios使用拦截器统一处理所有的http请求
- springMVC拦截器、json转换器、统一异常处理在配置文件中配置
- ssm(spring + springMVC + mybatis)拦截器
- ssm框架之拦截器
- SSM整合之拦截器
- springMVC之拦截器
- SpringMVC之拦截器
- SpringBoot 和 SpringMVC的异常统一处理
- SpringMvc拦截器登录处理
- springmvc统一异常处理
- html从入门到放弃(8)-html常见标签及使用案例
- (JDK9.0.1)使用eclipse代码提示慢(卡)的解决方案
- HBuilder打包手机app的方法
- UML类图描述符号说明
- 傻瓜式学习webpack(六)——一个项目多个webpack
- 【Maven+SSM】Springmvc的统一处理之拦截器
- 项目二
- Java小游戏-----人的一生
- python list 的进阶
- Git使用Beyond Compare作为比对合并工具
- LevelDB使用手册
- Springmvc和mybatis整合
- 枚举的作用
- Linux动态链接库无法打开和头文件包含的问题