HandlerInterceptor(拦截器)

preHandle:预处理回调方法,实现处理器的预处理(如登录检查),第三个参数为响应的处理器(如我们上一章的Controller实现);
     返回值:true表示继续流程(如调用下一个拦截器或处理器);
                 false表示流程中断(如登录检查失败),不会继续调用其他的拦截器或处理器,此时我们需要通过response来产生响应;
postHandle:后处理回调方法,实现处理器的后处理(但在渲染视图之前),此时我们可以通过modelAndView(模型和视图对象)对模型数据进行处理或对视图进行处理,modelAndView也可能为null。

afterCompletion:整个请求处理完毕回调方法,即在视图渲染完毕时回调(响应返回到视图后),如性能监控中我们可以在此记录结束时间并输出消耗时间,还可以进行一些资源清理,类似于try-catch-finally中的finally,但仅调用处理器执行链中preHandle返回true的拦截器的afterCompletion。

正常流程:


中断流程:


在springMVC.xml配置:

    <mvc:interceptors>
		<mvc:interceptor>
			<mvc:mapping path="/**"/>
			<bean class="com.qdhtxx.interceptor.LoginInterceptor"/>
		</mvc:interceptor>
	</mvc:interceptors>  -->

其中loginInterceptor为具体实现类:

public class LoginInterceptor extends HandlerInterceptorAdapter{
	@Override
	public boolean preHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler) throws Exception {
		String path = request.getServletPath();
		System.out.println("path:" + path);
		if (path.matches(Const.NO_INTERCEPTOR_PATH)) {
			return true;
		} else {
			HttpSession session = request.getSession();
			User user = (User) session
					.getAttribute(Const.WBUSER_SESSION);
			if (user != null) {
				return true;
			} else {
					response.sendRedirect(request.getContextPath()
							+ Const.WB_USER_LOGIN);
				return false;
			}
		}
	}

}

其中:

public class Const {
	public static final String WBUSER_SESSION = "wbuser_session";
	public static final String NO_INTERCEPTOR_PATH = "(/pages/system/login.jsp)||(/loginIn)||(/css/login.css)||(/js/jquery-1.7.2.min.js)||(/images/*.*)";
	public static final String WB_USER_LOGIN = "/pages/system/login.jsp";
	public static final String WB_USER_DEPT = "WB_USER_DEPT";
	public static final String WB_USER_ROLES = "WB_USER_ROLES";
	public static final String WB_USER_ROLE = "WB_USER_ROLE";
	//=====================================
    public static final String REDIRECT_HOME = "/";
	public static final String SESSION_USER = "USER";		//保存用户
	public static final String LAST_PAGE = "LAST_PAGE";		//
	// 保存cookie的cookieName
	public static final String COOKIEDOMAINNAME = "2015_V_5_SSM";   //自己随便定义
	// 加密cookie时的网站自定码
	public static final String WEBKEY = "2015_V_5_SSM";  	 	//自己随便定义
}

    里面的NO_INTERCEPTOR_PATH是不会被拦截的请求路径,如果是其他路径,当发现session里面没有用户登录时会返回到登录页,即:WB_USER_LOGIN。

    还有另外一种方式可以区分出不被拦截的路径,在配置文件中加:

<mvc:exclude-mapping path="/manage/user/login.do"/>

来排除某个路径。例如:

    <mvc:interceptors>
        <!-- 定义在这里的,所有的都会拦截-->
        <mvc:interceptor>
            <!--manage/a.do  /manage/*-->
            <!--manage/b.do  /manage/*-->
            <!--manage/product/save.do /manage/**-->
            <!--manage/order/detail.do /manage/**-->
            <mvc:mapping path="/manage/**"/>
            <!--排除某个路径-->
            <!--<mvc:exclude-mapping path="/manage/user/login.do"/>-->
            <bean class="com.mmall.controller.common.interceptor.AuthorityInterceptor" />
        </mvc:interceptor>
        <!--<!–第二个拦截器–>-->
        <!--<mvc:interceptor>-->
            <!---->
        <!--</mvc:interceptor>-->
    </mvc:interceptors>
过滤器也可以实现类似的功能,他们二者之间的区别,可见: 对于Java Web中的Filter和Interceptor的理解
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值