Spring MVC 自定义拦截器

2022年9月9日09:13:54

拦截器

Spring MVC 的处理器拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理。

预处理:在访问controller之前执行的代码
后处理:在访问controller返回之后执行的代码

拦截器链(Interceptor Chain):拦截器链就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。

可以自定义实现拦截器,需要实现HandlerInterceptor 接口

拦截器和过滤器的区别

  • 过滤器是 servlet 规范中的一部分, 任何 java web 工程都可以使用。
  • 拦截器是 SpringMVC 框架自己的,只有使用了 SpringMVC 框架的工程才能用。
  • 过滤器在 url-pattern 中配置了/*之后,可以对所有要访问的资源拦截。
  • 拦截器它是只会拦截访问的控制器方法,如果访问的是 jsp,html,css,image或者 js 是不会进行拦
    截的

自定义拦截器

在resources/springmvc.xml文件中配置拦截器:

<!--配置拦截器--><mvc:interceptors><!--配置拦截器--><mvc:interceptor><!--要拦截的具体的方法,当请求路径前缀是/user时拦截--><mvc:mapping path="/user/*"/><!--不要拦截的方法<mvc:exclude-mapping path=""/>--><!--配置拦截器对象--><beanclass="包名.MyInterceptor1"/></mvc:interceptor><!--配置第二个拦截器--><mvc:interceptor><!--要拦截的具体的方法,所有的请求都拦截--><mvc:mapping path="/**"/><!--不要拦截的方法<mvc:exclude-mapping path=""/>--><!--配置拦截器对象--><beanclass="包名.MyInterceptor2"/></mvc:interceptor></mvc:interceptors>

第一个拦截器:

publicclassMyInterceptor1implementsHandlerInterceptor{/**
     * 预处理,controller方法执行前
     * return true 放行,执行下一个拦截器,如果没有,执行controller中的方法
     * return false不放行
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */publicbooleanpreHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception{
        System.out.println("MyInterceptor1-preHandle-执行");returntrue;}/**
     * 后处理方法,controller方法执行后,success.jsp执行之前
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */publicvoidpostHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)throws Exception{
        System.out.println("MyInterceptor1-postHandle-执行");}/**
     * success.jsp页面执行后,该方法会执行
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */publicvoidafterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throws Exception{
        System.out.println("MyInterceptor1-afterCompletion-执行");}}
publicclassMyInterceptor2implementsHandlerInterceptor{/**
     * 预处理,controller方法执行前
     * return true 放行,执行下一个拦截器,如果没有,执行controller中的方法
     * return false不放行
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */publicbooleanpreHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception{
        System.out.println("MyInterceptor2-preHandle-执行");returntrue;}/**
     * 后处理方法,controller方法执行后,success.jsp执行之前
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */publicvoidpostHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)throws Exception{
        System.out.println("MyInterceptor2-postHandle-执行");}/**
     * success.jsp页面执行后,该方法会执行
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */publicvoidafterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throws Exception{
        System.out.println("MyInterceptor2-afterCompletion-执行");}}

UserController :

@Controller@RequestMapping("/user")publicclassUserController{@RequestMapping("/testInterceptor")public StringtestInterceptor(){
        System.out.println("UserController.testInterceptor控制器-执行");//success.jsp页面return"success";}}

success.jsp:

<% System.out.println("success.jsp-执行");%>

当请求/user/testInterceptor时,控制台打印结果:
MyInterceptor1-preHandle-执行
MyInterceptor2-preHandle-执行
UserController.testInterceptor控制器-执行
MyInterceptor2-postHandle-执行
MyInterceptor1-postHandle-执行
success.jsp-执行
MyInterceptor2-afterCompletion-执行
MyInterceptor1-afterCompletion-执行

  • 作者:IT_10-
  • 原文链接:https://blog.csdn.net/IT_10/article/details/103758490
    更新时间:2022年9月9日09:13:54 ,共 3349 字。