写点什么

从原理带你掌握 Spring MVC 拦截处理器知识

  • 2021 年 11 月 19 日
  • 本文字数:1305 字

    阅读完需:约 4 分钟

​​摘要:SpringWebMVC 的处理器拦截器,类似于 Servlet 开发中的过滤器 Filter,用于处理器进行预处理和后处理。

 

本文分享自华为云社区《不讲废话,全程干货,0基础带你学习SpringMVC拦截处理器》,作者:JavaEdge 。

1、工作原理流程图



2、Spring Web MVC 的处理器拦截器


  • HandlerInterceptor



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


HandlerInterceptor 接口定义了如下方法:

preHandle


该方法将在请求处理之前进行调用,只有当该方法返回 true 时,才会继续调用下一个 Interceptor 的 preHandle(),如果已是最后一个 Interceptor 就会是调用当前请求的 Controller

postHandle


该方法将在请求处理后,DispatcherServlet 进行视图返回渲染之前进行调用,可以在这个方法中对 Controller 处理之后的 ModelAndView 对象进行操作(比如这里加入公用信息以便页面显示)

afterCompletion


该方法也是需要当前对应的 Interceptor 的 preHandle 方法的返回值为 true 时才会执行,该方法将在整个请求结束之后,也就是在 DispatcherServlet 渲染了对应的视图之后执行,用于资源清理

3、拦截器配置

3.1 针对某种 mapping 拦截器配置


 <bean     class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">     <property name="interceptors">        <list>           <ref bean="handlerInterceptor1"/>           <ref bean="handlerInterceptor2"/>        </list>     </property>  </bean>  <bean id="handlerInterceptor1"class="springmvc.intercapter.HandlerInterceptor1"/>  <bean id="handlerInterceptor2"class="springmvc.intercapter.HandlerInterceptor2"/> 
复制代码


3.2 针对所有 mapping 配置全局拦截器


<!--拦截器 -->  <mvc:interceptors>     <!--多个拦截器,顺序执行 -->     <mvc:interceptor>        <mvc:mapping path="/**"/>        <bean class="com.sss.filter.HandlerInterceptor1"></bean>     </mvc:interceptor>     <mvc:interceptor>        <mvc:mapping path="/**"/>        <bean class="com.sss.filter.HandlerInterceptor2"></bean>     </mvc:interceptor>  </mvc:interceptors>  
复制代码


4、实践


用户访问其他页面时,从 Seesion 中获取到用户,未登录则重定向到登录页面。


Public class LoginInterceptor implements HandlerInterceptor{       @Override      Public boolean preHandle(HttpServletRequest request,              HttpServletResponse response, Object handler) throws Exception {            //如果是登录页面则放行          if(request.getRequestURI().indexOf("login.action")>=0){              return true;          }          HttpSession session = request.getSession();          //如果用户已登录也放行          if(session.getAttribute("user")!=null){              return true;          }          //用户没有登录挑战到登录页面          request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);                    return false;      }  
复制代码


点击关注,第一时间了解华为云新鲜技术~

发布于: 2 小时前阅读数: 4
用户头像

提供全面深入的云计算技术干货 2020.07.14 加入

华为云开发者社区,提供全面深入的云计算前景分析、丰富的技术干货、程序样例,分享华为云前沿资讯动态,方便开发者快速成长与发展,欢迎提问、互动,多方位了解云计算! 传送门:https://bbs.huaweicloud.com/

评论

发布
暂无评论
从原理带你掌握Spring MVC拦截处理器知识