基于SpirngMVC登录拦截器(使用了redis缓存),仅供参考

来源:互联网 发布:java的cookie 编辑:程序博客网 时间:2024/06/14 17:09
package com.avic.core.interceptor;import java.io.PrintWriter;import java.io.UnsupportedEncodingException;import java.net.URLEncoder;import java.text.SimpleDateFormat;import java.util.Date;import java.util.HashMap;import java.util.Map;import java.util.Properties;import javax.annotation.Resource;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.commons.lang3.time.DateUtils;import org.apache.log4j.Logger;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONObject;import com.avic.api.constant.Constant;import com.avic.api.entity.User;import com.avic.api.entity.UserToken;import com.avic.api.service.IUserTokenService;import com.avic.core.cache.JedisUtils;import com.avic.core.entity.ResultData;import com.avic.core.initialize.InitializeData;import com.avic.core.utils.DateUtil;import com.avic.core.utils.SpringContextUtil;/** * 验证相应操作是否需登录之后才能进行操作拦截器 * */public class CheckIsLoginIntercepter implements HandlerInterceptor {public static Logger logger = Logger.getLogger(CheckIsLoginIntercepter.class);@Resourcepublic Properties customSource;@Autowiredprivate InitializeData initializeData;    /**     * 验证url是否需要进行登录验证     */@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {    String cookieValue =null;    // 根据cookie初始判断是否登录,//cookie与session中都存在时,为登录状态Cookie cookies []= request.getCookies();Map<String, String> maps=null;Cookie ck=null;if(cookies.length==0){logger.debug("user not login");String type = request.getHeader("X-Requested-With");  if ("XMLHttpRequest".equalsIgnoreCase(type)) {PrintWriter printWriter = response.getWriter();printWriter.print("{\"result\": \"0\"}");printWriter.flush();printWriter.close();return false;}// 跳转到登录页面之前的urlresponse.sendRedirect(this.getCustomPropertyData(Constant.PC_DOMAIN_KEY, request)+"/login?refer="+getBackUrl(request));return false;}else{//取得当前浏览的cookiefor(Cookie cookie : cookies){if(Constant.SESSION_UID.equals(cookie.getName())){cookieValue = cookie.getValue();continue;}if(cookie.getName().equals("s_u_id")){            maps=new HashMap<String, String>();            maps.put(cookie.getName(), cookie.getValue());            ck=cookie;            continue;          }}//存在进行相应的数据校验比对,判断用户是否还处于登录状态if(cookieValue!=null){if(maps!=null){String sid=maps.get("s_u_id");JSONObject po = JSONObject.parseObject(sid);String jsessionid = po.getString("jsessionid");if(!jsessionid.equals(cookieValue)){//redis缓存中有效时间已经失效,重新登录response.sendRedirect(this.getCustomPropertyData(Constant.PC_DOMAIN_KEY, request)+"/login?refer="+getBackUrl(request));return false;}User user=null;//取redis缓存中对象进行数据校验比对User u=(User) JedisUtils.getObject(jsessionid);if(u!=null&&!u.equals("")){String userId = po.getString("userId");String token = po.getString("token");user=new User();user.setUserId(Integer.parseInt(userId));user.setToken(token);//如果数据匹配不上,进行重新登录if(!userId.equals(u.getUserId())&&!token.equals(u.getToken())){response.sendRedirect(this.getCustomPropertyData(Constant.PC_DOMAIN_KEY, request)+"/login?refer="+getBackUrl(request));return false;}if(user!=null&&u!=null){    //如果当前登录用户登录之后一直保持操作,需要进行有效期的延迟操作,确保操作在有效期内long nowTime=new Date().getTime();long expireTime = u.getExpireTime().getTime();long resultTime=nowTime-expireTime;//当正在操作的用户登录有效期小于10分钟时,进行自动延迟,过期时间自动延迟到20分钟if(resultTime<=600000&&resultTime>0){JedisUtils.delObject(cookieValue);//删除原先的u.setExpireTime(DateUtil.addMinute(new Date(),20));            JedisUtils.setObject(cookieValue,u, 30*60);//重新添加,并且有效期为30分钟}//将当前登录对象缓存到request对象中,需要取当前用户信息,可以从request中取出用户信息request.setAttribute("loginUser",u);return true;}else{//redis缓存中有效时间已经失效,重新登录response.sendRedirect(this.getCustomPropertyData(Constant.PC_DOMAIN_KEY, request)+"/login?refer="+getBackUrl(request));return false;}/*//取得当前浏览的cookiefor(Cookie cookie : cookies){if(cookieValue.equals(cookie.getName())){String userJson=cookie.getValue();//取得cookie缓存的登录对象user的json字符串JSONObject paramObj = JSONObject.parseObject(userJson);String userId = paramObj.getString("userId");String token = paramObj.getString("token");user=new User();user.setUserId(Integer.parseInt(userId));user.setToken(token);//如果数据匹配不上,进行重新登录if(!userId.equals(u.getUserId())&&!token.equals(u.getToken())){response.sendRedirect(this.getCustomPropertyData(Constant.PC_DOMAIN_KEY, request)+"/login?refer="+getBackUrl(request));return false;}break;}}if(user!=null&&u!=null){    //如果当前登录用户登录之后一直保持操作,需要进行有效期的延迟操作,确保操作在有效期内long nowTime=new Date().getTime();long expireTime = u.getExpireTime().getTime();long resultTime=nowTime-expireTime;//当正在操作的用户登录有效期小于10分钟时,进行自动延迟,过期时间自动延迟到20分钟if(resultTime<=600000&&resultTime>0){JedisUtils.delObject(cookieValue);//删除原先的u.setExpireTime(DateUtil.addMinute(new Date(),20));            JedisUtils.setObject(cookieValue,u, 30*60);//重新添加,并且有效期为30分钟}//将当前登录对象缓存到request对象中,需要取当前用户信息,可以从request中取出用户信息request.setAttribute("loginUser",u);return true;}else{//redis缓存中有效时间已经失效,重新登录response.sendRedirect(this.getCustomPropertyData(Constant.PC_DOMAIN_KEY, request)+"/login?refer="+getBackUrl(request));return false;}*/  }else{//redis缓存中有效时间已经失效,重新登录response.sendRedirect(this.getCustomPropertyData(Constant.PC_DOMAIN_KEY, request)+"/login?refer="+getBackUrl(request));return false;  }}else{//redis缓存中有效时间已经失效,重新登录response.sendRedirect(this.getCustomPropertyData(Constant.PC_DOMAIN_KEY, request)+"/login?refer="+getBackUrl(request));return false;}}}return true;}/** * 获取系统配置的个系统域名或者请求URL * @param key * @param isHttpHeader 是否包含http头 1:是 0:否 * @param request * @return */public String getCustomPropertyData(String key,HttpServletRequest request) {String result = customSource.getProperty(key);return result;}/** * 取得登录前url * @param request * @return */public String getBackUrl(HttpServletRequest request) {try {String queryString = request.getQueryString();String contextPath = request.getContextPath();String servletPath = request.getServletPath();int serverPort = request.getServerPort();StringBuffer urlBuffer = new StringBuffer();urlBuffer.append(request.getScheme()).append("://").append(request.getServerName());if ( serverPort>0 ) {//如果有端口urlBuffer.append(":").append(serverPort);}urlBuffer.append(contextPath != null ? contextPath : "").append(servletPath != null ? servletPath : "").append(queryString != null ? "?"+queryString : "");return  URLEncoder.encode(urlBuffer.toString(), "UTF-8");} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();}return "";}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throws Exception {}}

阅读全文
0 0
原创粉丝点击