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是否过期

猜你喜欢

转载自www.cnblogs.com/lm-book/p/9368222.html