公司目前有两个项目,需求实现单线,为了尽快完成进度,基于cookie实现了单线,在此记录一下,以免忘记。
两个项目都是基于SSM 框架,登录使用的是session,为了尽量少的改动两个项目,为两个项目添加拦截器。并在登录、注册、退出的功能做了少量的改动。
1、拦截器实现
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
String property = PropertiesUtil.getProperty("isSSO");
if(!"1".equals(property)){
return true;
}
MbMember attribute = (MbMember)request.getSession().getAttribute("sessionMember");
Cookie[] cookies = request.getCookies();
if(cookies == null || cookies.length < 1)return true;
for (Cookie cookie : cookies) {
String cookieName = cookie.getName();
if("USER_SSO".equals(cookieName)){
String value = cookie.getValue();
MbMember mbmember = mbmember = memberService.selectByPW(pwd);
request.getSession().setAttribute("sessionMember", mbmember);
}
}
}
if("SSO_OUT".equals(cookieName)){
if(attribute != null){
request.getSession().setAttribute("sessionMember", null);
}
}
}
return true;
}
登录和注册只修改了
//SSO 开启状态
String property = PropertiesUtil.getProperty("isSSO");
if("1".equals(property)){
//SSO种Cookie
String cookieValue = selectByPhone.getPassword() + selectByPhone.getPwdAttach();
Cookie cookie = new Cookie("USER_SSO", cookieValue);
cookie.setMaxAge(60*30);
cookie.setPath("/");
cookie.setDomain(".luosijinrong.com");
Cookie clearCookie = new Cookie("SSO_OUT", "");
clearCookie.setMaxAge(0);
clearCookie.setPath("/");
clearCookie.setDomain(".XXXXX.com");
response.addCookie(clearCookie);
response.addCookie(cookie);
}
退出:
String property = PropertiesUtil.getProperty("isSSO");
if("1".equals(property)){
//退出登录时,种清除cookie,提供电商系统的依据
Cookie addCookie = new Cookie("SSO_OUT", "XZDSMYSMSB");
addCookie.setPath("/");
addCookie.setDomain(".XXXXX.com");
Cookie clearCookie = new Cookie("USER_SSO", "");
clearCookie.setMaxAge(0);
clearCookie.setPath("/");
clearCookie.setDomain(".XXXXX.com");
response.addCookie(addCookie);
response.addCookie(clearCookie);
}