单点登录实现

  单点登录是意思就是一个地方登录,其他地方无需再次登录。如果是单一应用、单一系统,那么也就谈不上要单点登录了,因为你本来就只有一个登陆的入口。大型应用、复杂系统涉及到父子系统、多系统等多个登陆入口,实现单点登录能提升用户体验,一处登录,处处登录,免除了用户重复输入登陆信息的烦恼。

  单点登录的实现方式多种多样,核心思想还是只有一个:第一次登陆后生成一个令牌,后来的登陆只需获取该令牌,验证通过即认为已登陆,直接放行。令牌就是通行证,登录生成通行证,重新登陆时查证。目前比较流行的做法是使用独立的数据库或缓存来存通行证,这样既可以解耦业务,也解决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
        
    }
    
}

猜你喜欢

转载自www.cnblogs.com/wuxun1997/p/9230134.html
今日推荐