SpringMVC-拦截器

水深无声 2023-08-17 16:24 17阅读 0赞

SpringMVC拦截器

1.拦截器的作用

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

  用户可以自定义一些拦截器来实现特定的功能。

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

  拦截器和过滤器的区别:

    过滤器是Servlet规范中的一部分,任何java web工程都可以使用。

    拦截器是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才可以使用。

    过滤器在url-pattern中配置了/*之后,可以对所有要访问的资源拦截。

    拦截器它只会拦截访问的控制器方法,如果访问的是jsp,html,css,image或者是js是不会进行拦截的。

  它也是AOP思想的具体应用。

  我们要想自定义拦截器,要求必须实现:HandlerInterceptor接口。

2. 自定义拦截器的步骤

  2.1 第一步:编写一个普通类实现HandlerInterception接口

  1. package com.llb.interception;
  2. import org.springframework.web.servlet.HandlerInterceptor;
  3. import org.springframework.web.servlet.ModelAndView;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. /**
  7. * 自定义拦截器
  8. * Ceate By llb on 2019/8/21
  9. */
  10. public class MyInterception2 implements HandlerInterceptor {
  11. /**
  12. * 预处理,controller方法执行前
  13. * return true;放行,执行下一个拦截器,如果没有就执行controller方法
  14. * return false; 不放行
  15. * @param request
  16. * @param response
  17. * @param handler
  18. * @return
  19. * @throws Exception
  20. */
  21. @Override
  22. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  23. System.out.println("拦截器preHandle方法执行了------前2222");
  24. // request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request, response);
  25. return true;
  26. }
  27. /**
  28. * 后处理,controller执行方法后执行
  29. * @param request
  30. * @param response
  31. * @param handler
  32. * @param modelAndView
  33. * @throws Exception
  34. */
  35. @Override
  36. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
  37. System.out.println("拦截器postHandle方法执行了------后2222");
  38. // request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request, response);
  39. }
  40. /**
  41. * 页面显示后执行
  42. * @param request
  43. * @param response
  44. * @param handler
  45. * @param ex
  46. * @throws Exception
  47. */
  48. @Override
  49. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
  50. System.out.println("拦截器afterCompletion方法执行了------最后2222");
  51. }
  52. }

  2.2 配置拦截器

  1. <!--配置拦截器-->
  2. <mvc:interceptors>
  3. <mvc:interceptor>
  4. <!--要拦截的方法:配置一个即可-->
  5. <mvc:mapping path="/user/*"/>
  6. <!--配置拦截器对象-->
  7. <bean class="com.llb.interception.MyInterception" />
  8. <!--不拦截的方法:配置一个即可-->
  9. <!--<mvc:exclude-mapping path=""></mvc:exclude-mapping>-->
  10. </mvc:interceptor>
  11. </mvc:interceptors>

  2.3 控制器方法

  1. /**
  2. * Ceate By llb on 2019/8/21
  3. */
  4. @Controller
  5. @RequestMapping("/user")
  6. public class UserController {
  7. /**
  8. * 测试拦截器
  9. * @return
  10. */
  11. @RequestMapping("/testInterception")
  12. public String testInterception(){
  13. System.out.println("控制器执行了");
  14. return "success";
  15. }
  16. }

  2.4 测试运行结果

1685989-20190822140453644-424739598.png

3. 拦截器的细节

  3.1 拦截器的放行

  如果有下一个拦截器就执行下一个,如果该拦截器处于拦截器链最后一个,则执行控制器中的方法。

  3.2 拦截器中的方法说明

  1. /**
  2. * 预处理,controller方法执行前
  3. * return true;放行,执行下一个拦截器,如果没有就执行controller方法
  4. * return false; 不放行
  5. *
  6. * 如何调用:
  7. * 按拦截器定义顺序调用
  8. * 何时调用:
  9. * 只要配置了都会调用
  10. * 有什么用:
  11. * 如果程序员决定该拦截器对请求拦截处理后还要调用其他的拦截器,或是业务处理器进行处理,则返回true
  12. * 如果程序员决定不再调用其他的组件去处理请求,则返回false
  13. * @param request
  14. * @param response
  15. * @param handler
  16. * @return
  17. * @throws Exception
  18. */
  19. @Override
  20. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  21. System.out.println("拦截器preHandle方法执行了------前1111");
  22. // request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request, response);
  23. return true;
  24. }
  25. /**
  26. * 后处理,controller执行方法后执行
  27. *
  28. * 如何调用:
  29. * 按拦截器定义逆序调用
  30. * 何时调用:
  31. * 在拦截器链内所有拦截器返回成功调用
  32. * 有什么用:
  33. * 在业务处理器处理完请求后,但是DispatcherServlet向客户端返回响应前被调用。
  34. * 在该方法中对用户请求request进行处理。
  35. * @param request
  36. * @param response
  37. * @param handler
  38. * @param modelAndView
  39. * @throws Exception
  40. */
  41. @Override
  42. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
  43. System.out.println("拦截器postHandle方法执行了------后1111");
  44. // request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request, response);
  45. }
  46. /**
  47. * 如何调用:
  48. * 按拦截器定义逆序调用
  49. * 何时调用:
  50. * 只有preHandler返回true才调用
  51. * 有什么用:
  52. * 在DispatcherServlet完全处理完请求后被调用
  53. * 可以在该方法中进行一些资源清理的操作
  54. * @param request
  55. * @param response
  56. * @param handler
  57. * @param ex
  58. * @throws Exception
  59. */
  60. @Override
  61. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
  62. System.out.println("拦截器afterCompletion方法执行了------最后1111");
  63. }

  3.3 拦截器的作用路径

  1. <!--配置拦截器-->
  2. <mvc:interceptors>
  3. <mvc:interceptor>
  4. <!--要拦截的方法:配置一个即可:指定拦截的url-->
  5. <mvc:mapping path="/user/*"/>
  6. <!--配置拦截器对象-->
  7. <bean class="com.llb.interception.MyInterception" />
  8. <!--不拦截的方法:配置一个即可-->
  9. <!--<mvc:exclude-mapping path=""></mvc:exclude-mapping>-->
  10. </mvc:interceptor>
  11. </mvc:interceptors>

  3.4 多个拦截器的执行顺序

    按照配置的顺序进行执行的:

1685989-20190822143920581-1936292375.png

4. 多拦截器执行测试

  4.1 springmvc.xml配置:

  1. <!--配置拦截器-->
  2. <mvc:interceptors>
  3. <mvc:interceptor>
  4. <!--要拦截的方法:配置一个即可-->
  5. <mvc:mapping path="/user/*"/>
  6. <!--配置拦截器对象-->
  7. <bean class="com.llb.interception.MyInterception" />
  8. <!--不拦截的方法:配置一个即可-->
  9. <!--<mvc:exclude-mapping path=""></mvc:exclude-mapping>-->
  10. </mvc:interceptor>
  11. <mvc:interceptor>
  12. <!--要拦截的方法:配置一个即可-->
  13. <mvc:mapping path="/user/*"/>
  14. <!--配置拦截器对象-->
  15. <bean class="com.llb.interception.MyInterception2" />
  16. <!--不拦截的方法:配置一个即可-->
  17. <!--<mvc:exclude-mapping path=""></mvc:exclude-mapping>-->
  18. </mvc:interceptor>
  19. </mvc:interceptors>

  4.2 拦截器1的代码

    

  1. /**
  2. * 自定义拦截器
  3. * Ceate By llb on 2019/8/21
  4. */
  5. public class MyInterception implements HandlerInterceptor {
  6. /**
  7. * 预处理,controller方法执行前
  8. * @param request
  9. * @param response
  10. * @param handler
  11. * @return
  12. * @throws Exception
  13. */
  14. @Override
  15. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  16. System.out.println("拦截器preHandle方法执行了------前1111");
  17. // request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request, response);
  18. return true;
  19. }
  20. /**
  21. * 后处理,controller执行方法后执行
  22. * @param request
  23. * @param response
  24. * @param handler
  25. * @param modelAndView
  26. * @throws Exception
  27. */
  28. @Override
  29. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
  30. System.out.println("拦截器postHandle方法执行了------后1111");
  31. // request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request, response);
  32. }
  33. /**
  34. * 页面显示后执行
  35. * @param request
  36. * @param response
  37. * @param handler
  38. * @param ex
  39. * @throws Exception
  40. */
  41. @Override
  42. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
  43. System.out.println("拦截器afterCompletion方法执行了------最后1111");
  44. }
  45. }

  4.3 拦截器2的代码  

  1. /**
  2. * 自定义拦截器
  3. * Ceate By llb on 2019/8/21
  4. */
  5. public class MyInterception2 implements HandlerInterceptor {
  6. /**
  7. * 预处理,controller方法执行前
  8. * return true;放行,执行下一个拦截器,如果没有就执行controller方法
  9. * return false; 不放行
  10. * @param request
  11. * @param response
  12. * @param handler
  13. * @return
  14. * @throws Exception
  15. */
  16. @Override
  17. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  18. System.out.println("拦截器preHandle方法执行了------前2222");
  19. // request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request, response);
  20. return true;
  21. }
  22. /**
  23. * 后处理,controller执行方法后执行
  24. * @param request
  25. * @param response
  26. * @param handler
  27. * @param modelAndView
  28. * @throws Exception
  29. */
  30. @Override
  31. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
  32. System.out.println("拦截器postHandle方法执行了------后2222");
  33. // request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request, response);
  34. }
  35. /**
  36. * 页面显示后执行
  37. * @param request
  38. * @param response
  39. * @param handler
  40. * @param ex
  41. * @throws Exception
  42. */
  43. @Override
  44. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
  45. System.out.println("拦截器afterCompletion方法执行了------最后2222");
  46. }
  47. }

  4.4 控制器方法

  1. /**
  2. * Ceate By llb on 2019/8/21
  3. */
  4. @Controller
  5. @RequestMapping("/user")
  6. public class UserController {
  7. /**
  8. * 测试拦截器
  9. * @return
  10. */
  11. @RequestMapping("/testInterception")
  12. public String testInterception(){
  13. System.out.println("控制器执行了");
  14. return "success";
  15. }
  16. }

  4.5 运行结果

1685989-20190822145941248-1576292228.png


源码:github

转载于:https://www.cnblogs.com/liulebin/p/11394423.html

发表评论

表情:
评论列表 (有 0 条评论,17人围观)

还没有评论,来说两句吧...

相关阅读

    相关 SpringMVC:拦截

    简介: 拦截器本身并不重要,但在源码中很重要。 拦截器用于拦截请求,用于在处理器执行前进行预处理或者处理执行完进行尾处理。 其作用类似于过滤器,不同的是过滤器是ser

    相关 springmvc拦截

    1. springmvc拦截器使用和原理理解 1.1 作用 与struts2类似,springmvc的拦截器主要作用也是在服务端真正处理请求前后进行一些相关的操作