• SpringMVC拦截器详解


    Springmvc的拦截器是一种类似于servlet过滤器的类,用于对控制器的预处理和后处理 来看源码:

    package org.springframework.web.servlet; public interface HandlerInterceptor {
    
    boolean preHandle( HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;
    
    void postHandle( HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception;
    
    void afterCompletion( HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception; }

    方法preHandle:用于对controller预处理,如判断是否登录,session过期检验,返回值为布尔型,为true就放行,为false就就拦截,需要用Reponse来进行响应;

    方法postHandle:后处理回调方法,在controller方法执行之后,视图渲染之前执行,可以对模型数据和视图进行处理,ModelandView对象可以为null;

    方法afterCompletion:请求处理完毕回调方法,在视图渲染完成之后执行,可以进行性能检测,输出消耗时间,类似于try-catch-finally中的finally,可以进行资源清理;

    我们来编写一个拦截器来进行session过期检验:

    public class sessionInterceptor implements HandlerInterceptor {
    
    @Override
    
    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception {
    
      System.out.println("执行了afterCompletion()方法");
    
    }
    
    @Override
    
    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception {
    
    System.out.println("执行了postHandle()方法");
    
    }
    
    /** * 返回值表示,是否需要将当前请求拦截下来 * 第三个参数,是被拦截请求的目标对象 */
    
    @Override
    
    public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
    
      System.out.println("执行了preHandle()方法");
    
      HttpSession session = arg0.getSession();
    
      //在进入web应用是将USer值传入session中,为null表示session超时,跳转到登录界面
    
      if (session.getAttribute("USER")!=null) {
    
        return true;
    
      }
    
      System.out.println("session超时");
    
      arg0.getRequestDispatcher("/WEB-INF/views/login.jsp").forward(arg0, arg1);
    
      return false;
    
      }
    
    }

    在SpringMVC.xml中配置拦截器:

    <!-- 注册拦截器 -->
        <mvc:interceptors>
            <!-- session过期检查拦截器 -->
            <mvc:interceptor>
                <!-- 需要拦截的页面 -->
                <mvc:mapping path="/**"/><!-- 1、 /**      表示所有文件夹及里面的子文件夹
                                              2、 /*        表示所有文件夹,不含子文件夹
                                              3、 /        表示web项目的根目录 -->
                <!-- 不需要拦截的页面 -->
                <mvc:exclude-mapping path="/showLogin"/>
                
                <!-- 静态资源,不需要拦截 -->
                <mvc:exclude-mapping path="/static/**"/>
    
                
                <bean class="cn.hbmy.wxfw.intercept.sessionInterceptor"></bean>
            </mvc:interceptor>
        
        </mvc:interceptors>

    mapping表示需要拦截的页面请求,exclude-mapping表示不需要拦截的页面,入登录界面和静态资源,最后,将拦截器类注入到框架中,这样对整个web应用进行检测,检测session是否过期

  • 相关阅读:
    汇编笔记
    【BZOJ 1701】Cow School(斜率优化/动态凸包/分治优化)
    MS-DOS 6.22 +Vim+masm 汇编环境
    「NOIP2017」时间复杂度
    CCF 201809-3 元素选择器
    CCF 201712-3 Crontab
    ICPC NWERC2019~2020 Practice Contest
    蓝桥杯模拟赛3 F:等差等比有联系 公差公比求通项
    CCF 201509-3 模板生成系统
    CCF 201503-3 节日
  • 原文地址:https://www.cnblogs.com/lm-book/p/9368222.html
Copyright © 2020-2023  润新知