单点登录是意思就是一个地方登录,其他地方无需再次登录。如果是单一应用、单一系统,那么也就谈不上要单点登录了,因为你本来就只有一个登陆的入口。大型应用、复杂系统涉及到父子系统、多系统等多个登陆入口,实现单点登录能提升用户体验,一处登录,处处登录,免除了用户重复输入登陆信息的烦恼。
单点登录的实现方式多种多样,核心思想还是只有一个:第一次登陆后生成一个令牌,后来的登陆只需获取该令牌,验证通过即认为已登陆,直接放行。令牌就是通行证,登录生成通行证,重新登陆时查证。目前比较流行的做法是使用独立的数据库或缓存来存通行证,这样既可以解耦业务,也解决cookie的跨域问题。
这里看一个简单例子,单系统,令牌就是sessionId,用cookie存放,用spring的切面来捕获登陆请求:
package com.wulinfeng.test.testpilling.util; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang.StringUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; /** * 登陆拦截 * * @author wulinfeng * @version C10 2017年10月11日 * @since SDP V300R003C10 */ public class InterceptorUtil implements HandlerInterceptor { /** 日志对象 */ private static Logger logger = LogManager.getLogger(InterceptorUtil.class.getName()); /** 是否启用cookie */ private static final String IS_COOKIE = PropertiesConfigUtil.getProperty("iscookie"); @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { logger.debug("InterceptorUtil.doFilter requesturl: " + request.getRequestURL()); String tokenId = null; if (IS_COOKIE.equals("1")) { Cookie[] cookies = request.getCookies(); if (cookies != null) { for (Cookie cookie : cookies) { if (cookie == null) { continue; } if (cookie.getName().equals("tokenId")) { tokenId = cookie.getValue(); break; } } } } else { if (request.getSession() != null) { tokenId = (String)request.getSession().getAttribute("tokenId"); } } if (StringUtils.isEmpty(tokenId)) { response.sendRedirect("/login.html"); } return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // TODO Auto-generated method stub } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // TODO Auto-generated method stub } }