package com.baidu.dsp.common.interceptor.login; import java.util.List; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.servlet.ModelAndView; import com.baidu.disconf.web.service.user.constant.UserConstant; import com.baidu.disconf.web.service.user.dto.Visitor; import com.baidu.disconf.web.service.user.service.UserMgr; import com.baidu.disconf.web.web.auth.constant.LoginConstant; import com.baidu.disconf.web.web.auth.login.RedisLogin; import com.baidu.dsp.common.constant.ErrorCode; import com.baidu.dsp.common.interceptor.WebCommonInterceptor; import com.github.knightliao.apollo.utils.tool.TokenUtil; import com.github.knightliao.apollo.utils.web.CookieUtils; /** * 所有请求(一个Session可能会有多个请求)均会通过此拦截器 * * @author liaoqiqi * @version 2013-11-28 */ public class LoginInterceptor extends WebCommonInterceptor { protected static final Logger LOG = LoggerFactory.getLogger(LoginInterceptor.class); @Resource private UserMgr userMgr; @Autowired private RedisLogin redisLogin; private List<String> notJsonPathList; private List<String> notInterceptPathList; // Cookie域 private String XONE_COOKIE_DOMAIN_STRING = "127.0.0.1"; @Override public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception { } @Override public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception { } /** * 采用两级缓存。先访问session,<br/> * 如果存在,则直接使用,并更新 threadlocal <br/> * 如果不存在,则访问 redis,<br/> * 如果redis存在,则更新session和threadlocal<br/> * 如果redis也不存在,则认为没有登录 */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // // 去掉不需拦截的path // String requestPath = request.getRequestURI(); // 显示所有用户的请求 LOG.info(request.getRequestURI()); if (notInterceptPathList != null) { // 更精确的定位 for (String path : notInterceptPathList) { if (requestPath.contains(path)) { return true; } } } /** * 种植Cookie */ plantCookie(request, response); /** * 登录与否判断 */ // // 判断session中是否有visitor // HttpSession session = request.getSession(); Visitor visitor = (Visitor) session.getAttribute(UserConstant.USER_KEY); // // session中没有该信息,则从 redis上获取,并更新session的数据 // if (visitor == null) { Visitor redisVisitor = redisLogin.isLogin(request); // // 有登录信息 // if (redisVisitor != null) { // 更新session中的登录信息 redisLogin.updateSessionVisitor(session, redisVisitor); } else { // 还是没有登录 returnJsonSystemError(request, response, "login.error", ErrorCode.LOGIN_ERROR); return false; } } else { // 每次都更新session中的登录信息 redisLogin.updateSessionVisitor(session, visitor); } return true; } /** * 种植Cookie * * @param request * @param response */ private void plantCookie(HttpServletRequest request, HttpServletResponse response) { String xId = CookieUtils.getCookieValue(request, LoginConstant.XONE_COOKIE_NAME_STRING); // 没有Cookie 则生成一个随机的Cookie if (xId == null) { String cookieString = TokenUtil.generateToken(); CookieUtils .setCookie(response, LoginConstant.XONE_COOKIE_NAME_STRING, cookieString, XONE_COOKIE_DOMAIN_STRING, LoginConstant.XONE_COOKIE_AGE); } else { } } /** * @return the notJsonPathList */ public List<String> getNotJsonPathList() { return notJsonPathList; } /** * @param notJsonPathList the notJsonPathList to set */ public void setNotJsonPathList(List<String> notJsonPathList) { this.notJsonPathList = notJsonPathList; } /** * @return the notInterceptPathList */ public List<String> getNotInterceptPathList() { return notInterceptPathList; } /** * @param notInterceptPathList the notInterceptPathList to set */ public void setNotInterceptPathList(List<String> notInterceptPathList) { this.notInterceptPathList = notInterceptPathList; } public String getXONE_COOKIE_DOMAIN_STRING() { return XONE_COOKIE_DOMAIN_STRING; } public void setXONE_COOKIE_DOMAIN_STRING(String xONE_COOKIE_DOMAIN_STRING) { XONE_COOKIE_DOMAIN_STRING = xONE_COOKIE_DOMAIN_STRING; } }