Spring MVC 拦截器实现

拦截器代码

package com.feizhou.interceptor.login;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import com.feizhou.common.finalConfig.Constans;
import com.feizhou.common.tools.commonTools.StringUtil;
import com.feizhou.commonService.web.sessionProvider.CacheProvider;
import com.feizhou.core.bean.basicUser.UserInfo;

/**
 * 
 * @ClassName LoginInterceptor
 * @Description TODO(处理上下文)
 * @author feizhou
 * @Date 2017年9月22日 下午1:40:26
 * @version 1.0.0
 */

public class LoginInterceptor implements HandlerInterceptor {

	@Autowired
	private CacheProvider cacheProvider;

	private Integer adminId;// 管理员,给开发人员用,默认注入adminId=1

	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {

		if (adminId != null) {// 开发阶段不走正常流程,默认拦截器返回都是true,不走拦截url代码
			return true;
		}
		try {
			UserInfo userInfo = cacheProvider.getAttributeCaceh(request, "userInfo", response, UserInfo.class);
			if (StringUtil.isEmpty(userInfo)) {
				response.sendRedirect("/basic/toLogin.do");
				return false;// 用户没有登录,方法就不走了,调回登录页面让用户登录
			}
		} catch (Exception e) {
			e.printStackTrace();
			response.setStatus(500);
			return false;
		}

		return true;
	}

	// 方法后
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		// TODO Auto-generated method stub

	}

	// 页面渲染后
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		// TODO Auto-generated method stub

	}

	public void setAdminId(Integer adminId) {
		this.adminId = adminId;
	}

}

拦截器xml配置

<mvc:interceptors>

		<mvc:interceptor>
			<!-- 对所有的.do结尾的进行拦截,/**表示/下面任何字段,起初我用/*/*.do后来发现/*不能代表所有的字段,要使用/** -->
			<mvc:mapping path="/**/*.do" />
			<!-- 登录 -->
			<mvc:exclude-mapping path="/**/login.do" />
 
			<!--退出 -->
			<mvc:exclude-mapping path="/**/loginOut.do" />
			<!-- 跳转登录页面 -->
			<mvc:exclude-mapping path="/**/toLogin.do" />
			<!-- 发送验证码 -->
			<mvc:exclude-mapping path="/**/sendSms.do" />
			<!-- 注册用户 -->
			<mvc:exclude-mapping path="/**/registeredUserInfo.do" />
			<!-- 登录页面验证 -->
			<mvc:exclude-mapping path="/**/loginValidate.do" />
		 
		 

			<bean class="com.feizhou.interceptor.login.LoginInterceptor">
						 
						
				<!--adminId 配置是为了开发人员使用的权限 -->
				  <property name="adminId" value="1"/>  
			</bean>
		</mvc:interceptor>

		<mvc:interceptor>
			<!-- 对所有的/js/下的所有js文件进行拦截,对所有的.js的url添加时间簇 -->
			<mvc:mapping path="/resource/src/js/**" />
			<bean class="com.feizhou.interceptor.common.URlInterceptor">
			</bean>
		</mvc:interceptor>
  
 
	</mvc:interceptors>

    在拦截器中中有三个方法 :

          preHandler :在进入Handler方法之前执行了, 返回值为 false ,即可实现拦截;否则,返回true时,拦截不进行执行;

          postHandler : 进入Handler方法之后,返回ModelAndView之前执行,使用场景从ModelAndView参数出发,比如,将公用的模型数据在这里传入到视图,也可以统一指定显示的视图等;

         afterHandler : 在执行Handler完成后执行此方法,使用于统一的异常处理,统一的日志处理等;

猜你喜欢

转载自blog.csdn.net/zhou920786312/article/details/81099862