zoukankan      html  css  js  c++  java
  • 单点登录实现

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

      单点登录的实现方式多种多样,核心思想还是只有一个:第一次登陆后生成一个令牌,后来的登陆只需获取该令牌,验证通过即认为已登陆,直接放行。令牌就是通行证,登录生成通行证,重新登陆时查证。目前比较流行的做法是使用独立的数据库或缓存来存通行证,这样既可以解耦业务,也解决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
            
        }
        
    }
  • 相关阅读:
    30分钟速懂Java8新特性!
    学习数据结构和算法心得
    看似简单但容易忽视的编程常识
    你应该关注的几个Eclipse超酷插件
    无谓的通宵加班之后的思索
    比特币这么火热,看看这篇比特币初学者指南
    2017年最受欢迎的十大开源黑客工具
    15分钟破解网站验证码
    我的新博客:www.wangyufeng.org
    20 岁时候的你在想些什么?
  • 原文地址:https://www.cnblogs.com/wuxun1997/p/9230134.html
Copyright © 2011-2022 走看看