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

x33g5p2x  于2021-11-19 转载在 Spring  
字(2.1k)|赞(0)|评价(0)|浏览(509)

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

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

1 工作原理流程图

2 Spring Web MVC 的处理器拦截器

  • HandlerInterceptor

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

HandlerInterceptor接口定义了如下方法:

2.1 preHandle

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

2.2 postHandle

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

2.3 afterCompletion

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

3 拦截器配置

3.1 针对某种mapping拦截器配置

  1. <bean
  2. class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
  3. <property name="interceptors">
  4. <list>
  5. <ref bean="handlerInterceptor1"/>
  6. <ref bean="handlerInterceptor2"/>
  7. </list>
  8. </property>
  9. </bean>
  10. <bean id="handlerInterceptor1"class="springmvc.intercapter.HandlerInterceptor1"/>
  11. <bean id="handlerInterceptor2"class="springmvc.intercapter.HandlerInterceptor2"/>

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

  1. <!--拦截器 -->
  2. <mvc:interceptors>
  3. <!--多个拦截器,顺序执行 -->
  4. <mvc:interceptor>
  5. <mvc:mapping path="/**"/>
  6. <bean class="com.sss.filter.HandlerInterceptor1"></bean>
  7. </mvc:interceptor>
  8. <mvc:interceptor>
  9. <mvc:mapping path="/**"/>
  10. <bean class="com.sss.filter.HandlerInterceptor2"></bean>
  11. </mvc:interceptor>
  12. </mvc:interceptors>

4 实践

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

  1. Public class LoginInterceptor implements HandlerInterceptor{
  2. @Override
  3. Public boolean preHandle(HttpServletRequest request,
  4. HttpServletResponse response, Object handler) throws Exception {
  5. //如果是登录页面则放行
  6. if(request.getRequestURI().indexOf("login.action")>=0){
  7. return true;
  8. }
  9. HttpSession session = request.getSession();
  10. //如果用户已登录也放行
  11. if(session.getAttribute("user")!=null){
  12. return true;
  13. }
  14. //用户没有登录挑战到登录页面
  15. request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);
  16. return false;
  17. }

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

相关文章