拦截器代码
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完成后执行此方法,使用于统一的异常处理,统一的日志处理等;