单点登录的实现

简介: 从第三方系统单点登录到目标系统,第三方系统会发送token进行验证,通过解析token,获取相应的用户信息的json串。将其set到自己系统的session中。   public class sessionFilter extends OncePerRequestFilter{ // 登录页面 private String LoginPage = Configure.

从第三方系统单点登录到目标系统,第三方系统会发送token进行验证,通过解析token,获取相应的用户信息的json串。将其set到自己系统的session中。

 

public class sessionFilter extends OncePerRequestFilter{

	// 登录页面
    private String LoginPage = Configure.getInstance().getProperty("com.zyzx.dmc.login.html");

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
            throws ServletException, IOException {
		HttpServletRequest hrequest = (HttpServletRequest) request;
    	HttpSession session = hrequest.getSession();
        // 不过滤的uri
        String[] notFilter = new String[] { "login.html", ".js", "/css","/images", "/logout", "/druid", "/login","/ssoAuth" };

        // 请求的uri
        String url = request.getRequestURL().toString();
        //Token

        String token = request.getParameter("token");
//        String url = uri.replaceAll("html", "bak");
        // 是否过滤
        boolean doFilter = true;
        for (String s : notFilter) {
            if (url.indexOf(s) != -1) {
                // 如果uri中包含不过滤的uri,则不进行过滤
                doFilter = false;
                break;
            }
        }
        /*
         * if(uri.contains("jsp") && uri.indexOf("login.jsp") == -1) { doFilter
         * = true; }
         */
        if (doFilter) {
            // 执行过滤
            // 从session中获取登录者实体
            final IUserSession userSession = (IUserSession) session.getAttribute(IUserSession.ASIA_SESSION_NAME);
            if (userSession == null) {
                //未登录状态
                if(null == token){
                    response.sendRedirect(LoginPage + "?goto=" + url);
                    return;
                //token 存在则去保存session,验证用户信息
                }else {
                    JSONObject  result = checkTokenInfo(token);
                    if(null == result){
                        response.sendRedirect(LoginPage + "?goto=" + url);
                        return;
                    }
                    //验证成功
                    if("suc".equals(result.get("result"))){
                      //正常登录
                        Map<String,String> sessionUserInfo = new HashMap<String, String>();
                        UserMessage userMessage = new UserMessage();
                        sessionUserInfo = JsonUtil.json2HashMap(result.get("userInfo").toString());
                        sessionUserInfo.put("token", token);
                        
                        String ip = request.getHeader("x-forwarded-for"); 
                        if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 
                            ip = request.getHeader("Proxy-Client-IP"); 
                        } 
                        if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 
                            ip = request.getHeader("WL-Proxy-Client-IP"); 
                        } 
                        if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 
                            ip = request.getRemoteAddr(); 
                        } 
                        
                        userMessage.setUserID(sessionUserInfo.get("user_account"));
                        userMessage.setUserName(sessionUserInfo.get("user_name"));
                        userMessage.setSessionID(sessionUserInfo.get("token"));
                        userMessage.setClientIP(ip);
                        request.getSession().setAttribute(IUserSession.ASIA_SESSION_NAME,userMessage);
                        response.sendRedirect(url);
                    }else if("fail".equals(result.get("result"))){
                        response.sendRedirect(LoginPage + "?goto=" + url);
                    }
                }
                // 如果session中不存在登录者实体,则弹出框提示重新登录
                boolean isAjaxRequest = isAjaxRequest(request);
                if (isAjaxRequest) {
                    // 设置request和response的字符集,防止乱码
                    response.setContentType("text/html;charset=UTF-8");
                    response.sendError(HttpStatus.UNAUTHORIZED.value(), "您已经太长时间没有操作,请刷新页面");
                    return;
                }
            } else {
                // 如果session中存在登录者实体,则继续
                filterChain.doFilter(request, response);
            }
        } else {
            // 如果不执行过滤,则继续
            filterChain.doFilter(request, response);
        }
    }

    /**
     * 判断是否为Ajax请求 <功能详细描述>
     * 
     * @param request
     * @return 是true, 否false
     * @see [类、类#方法、类#成员]
     */
    public static boolean isAjaxRequest(HttpServletRequest request) {
        String header = request.getHeader("X-Requested-With");
        if (header != null && "XMLHttpRequest".equals(header))
            return true;
        else
            return false;
    }
    /**
     * 
     * 验证Token是否存在
     * @param tokenValue
     * @return
     * @throws IOException
     */
    private JSONObject checkTokenInfo(String tokenValue) throws IOException {
        String checkUrl = Configure.getInstance().getProperty("xxxxxUrl")+tokenValue;
        HttpClient httpclient = new HttpClient();
        GetMethod httpget = new GetMethod(checkUrl);
        try {
            httpclient.executeMethod(httpget);
            String result = httpget.getResponseBodyAsString();
            JSONObject json = JSONObject.fromObject(result);
            return json;
        } finally {
            httpget.releaseConnection();
        }
    }
    
}

  代码写完了,然后需要在web.xml中配置filter

<filter>
<filter-name>sessionFilter</filter-name>
<filter-class>代码路径.sessionFilter</filter-class>
</filter>

随后配置filter-mapping 

<filter-mapping>
<filter-name>sessionFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

 

OK结束。

 

目录
相关文章
|
8月前
|
安全 数据安全/隐私保护
单点登录
当今数字时代,我们面临着越来越多的在线服务和应用程序,每一个都要求我们输入用户名和密码以进行身份验证。这种情况下,如何在各种应用之间实现便捷而安全的身份验证变得至关重要。单点登录(Single Sign-On,简称SSO)便是一项解决这一问题的强大工具。在本文中,我们将详细介绍单点登录是什么以及为什么它如此重要。
|
19天前
|
安全 数据安全/隐私保护 UED
|
2月前
|
缓存 JavaScript API
bladex实现单点登录
bladex实现单点登录
38 0
|
7月前
|
存储 数据安全/隐私保护
我对SSO单点登录和OAuth2.0的理解
单点登录(SingleSignOn,SSO),就是通过用户的一次性鉴别登录。当用户在身份认证服务器上登录一次以后,即可获得访问单点登录系统中其他关联系统和应用软件的权限,用户只需一次登录就可以访问所有相互信任的应用系统。比如我们登录了公司的OA系统之后,在页面上点击邮件系统,则无需再跳转到邮件的登录页面,点过去就直接登录成功了。
96 0
|
9月前
|
存储 安全 小程序
|
9月前
|
存储 NoSQL Redis
什么是单点登录?
我们在真正的项目开发中一个项目往往是大型的,这时候会把一个单系统拆分成多个子系统,比如淘宝和天猫,虽然是两个系统,但隶属于一个公司开发的产品,当我们登录其中一个时,另一个也会登录。
78 0
|
10月前
|
存储 NoSQL 应用服务中间件
SSO(单点登陆)
SSO(单点登陆)
|
10月前
|
存储 安全 前端开发
基于OIDC的SSO单点登录
基于OIDC的SSO单点登录
394 0
|
消息中间件 前端开发 JavaScript
SSO 单点登录和 OAuth2.0 的区别和理解
SSO 单点登录和 OAuth2.0 的区别和理解
|
安全 数据安全/隐私保护 UED
什么是单点登录(SSO)?底层原理是什么?
什么是单点登录(SSO)?底层原理是什么?
379 0