SOS 单点登陆

使用iframe模拟登陆子系统,实现单点登陆。
使用到的有p3p声明,第三方Cookies
使用共同一个校验数据库表

父应用


login.html

<script>
     //地址栏参数
        function GetQueryString(name) {
            var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
            var r = window.location.search.substr(1).match(reg);
            if (r != null)return unescape(r[2]);
            return null;
        }
        /*
         *
         * @ID_Iframe 目标id @fn调用函数
         * */
        function appendIframe(params, fn) {
            var ID_Iframe = params.id;//iframe的id跟name
//            console.log(document.getElementById(ID_Iframe));
            var booleanAppend = document.getElementById(ID_Iframe) == undefined || document.getElementById(ID_Iframe) == null;
            if (ID_Iframe == "" || ID_Iframe == undefined) {
                ID_Iframe = "DownloadIframe";
            }
            if (booleanAppend) {
                $("body").append("<iframe id=" + ID_Iframe + " name=" + ID_Iframe + " height='0px' width='0px'></iframe>");
            }
            if (fn) {
                fn()
            }
        }
        //end 地址栏
        function go(sURL) {
            if (navigator.userAgent.indexOf("MSIE") != -1) {
//                location.href = sURL;
                window.navigate(sURL);
            } else {
                window.location.href = sURL;
            }
        }
        $(function () {
            $.post('/web/api/signin', 
                account: email, 
                password: password
                },function (data) {
                    var create_time = data.create_time;
                    var token = data.token;
                    var goLink = data.link +"/userToken?" +
                    "biu=0&create_time=" + create_time+ 
                    "&token=" + token;
                    appendIframe({id: "ID_Iframe"},
                    function () {
                         $("#ID_Iframe").attr("src", goLink);
                    });
                                //更改跳转时间间隔
                   var timer =setInterval(function(){
                       var context=$("body",$("ID_Iframe").body);
                      if(context.length==1){
                         clearInterval(timer);
                         var biu =GetQueryString("biu");
                        if (biu != null) {
                             var link=GetQueryString("link");
                             go(link);
                             return false;
                        }
                        //跳转到页面
                       var baseurl = getRequest("baseurl");
                       baseurl = (baseurl == null || baseurl == '' ? "/" : baseurl);
                       location.href = baseurl;
                                    }
                                },1000);
                            }
            });
        });
</script>

index.jsp

主页跳转脚本


<script>
    function go(sURL){
        if (navigator.userAgent.indexOf("MSIE") != -1) {
//                location.href = sURL;
            window.navigate(sURL);
        }else{
            window.location.href = sURL ;
        }
    }
    function goToBiu(){
        $.post("/userToken",{},function(data){
            if(data){
                var link = data.link;
                go(link);
            }
        });
    }
    </script>

父应用的控制器“/userToken“

    User user = getAccessUser(); //获取当前登录用户
    Map<String, Object> map =new HashMap<>();
    if(user!=null){//登陆
        map.put("link", EnumConst.userToken.Login.getValue()+"?thisNew=1");//EnumConst.userToken.Login.getValue()子页面的跳转页
    }else{
        map.put("link", EnumConst.userToken.INDEX.getValue()+"/views/login/login.html?biu=1&link="+EnumConst.userToken.Login.getValue());//EnumConst.userToken.INDEX.getValue() 父页面的域名,EnumConst.userToken.Login.getValue()子页面的跳转页
    }
    renderJson(map);//json格式资源返回


子应用


P3P.jsp

用于iframe返回页面

<!DOCTYPE html>
<html lang="en">
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%response.setHeader("P3P", "CP='IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT'");%>
<head>
    <meta http-equiv="P3P" content='CP="IDC DSP COR CURa ADMa  OUR IND PHY ONL COM STA"'>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=IE9|edge">
    <meta name="renderer" content="webkit|ie-comp|ie-stand">
</head>
<body>
</body>
<script src="https://cdn.bootcss.com/jquery/1.8.3/jquery.min.js" type="text/javascript"></script>
<script>
    var token = "${token}";
    var create_time = "${create_time}";
    $(function () {
        if (typeof(Storage) !== "undefined") {
            localStorage.token = token;
            localStorage.tokenTime = create_time;
            localStorage.thisNow = 0;
        } else {
            // 抱歉! 不支持 web 存储。
        }
        setCookieBox();
    });
    function setCookieBox() {
        document.cookie = "thisNow=0;path=/";
        document.cookie = "token=" + escape(token) + ";path=/";
        document.cookie = "create_time=" + escape(create_time) + ";path=/";
    }
</script>
</html>

login.jsp

中转页面

<!DOCTYPE html>
<html lang="en">
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%response.setHeader("P3P", "CP='IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT'");%>
<%String index = PropertyUtil.getGrosseValue(PropertyUtil.SSO, "INDEX").trim();%>
<head>
    <meta http-equiv="P3P" content='CP="IDC DSP COR CURa ADMa  OUR IND PHY ONL COM STA"'>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=IE9|edge">
    <meta name="renderer" content="webkit|ie-comp|ie-stand">
    <title>跳转中</title>
</head>
<body>

</body>
<script src="https://cdn.bootcss.com/jquery/1.8.3/jquery.min.js" type="text/javascript"></script>
<script>
    //读取cookies
    function getCookie(name) {
        var arr, reg = new RegExp("(^| )" + name + "=([^;]*)(;|$)");
        if (arr = document.cookie.match(reg)) {
            return unescape(arr[2]);
        } else {
            return null;
        }
    }
    function myBrowser() {
        var userAgent = navigator.userAgent; //取得浏览器的userAgent字符串
        var isOpera = userAgent.indexOf("Opera") > -1;
        if (isOpera) {
            return "Opera"
        }//判断是否Opera浏览器
        if (userAgent.indexOf("Firefox") > -1) {
            return "FF";
        } //判断是否Firefox浏览器
        if (userAgent.indexOf("Chrome") > -1) {
            return "Chrome";
        }
        if (userAgent.indexOf("Safari") > -1) {
            return "Safari";
        } //判断是否Safari浏览器
        if (userAgent.indexOf("compatible") > -1 && userAgent.indexOf("MSIE") > -1 && !isOpera) {
            return "IE";
        }//判断是否IE浏览器
    }
    //地址栏参数
    function GetQueryString(name) {
        var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
        var r = window.location.search.substr(1).match(reg);
        if (r != null)return unescape(r[2]);
        return null;
    }

    $(function () {
        var ref = '';
        if (document.referrer.length > 0) {
            ref = document.referrer;
        }
        try {
            if (ref.length == 0 && opener.location.href.length > 0) {
                ref = opener.location.href;
            }
        } catch (e) {
        }
        document.cookie = "history=" + escape(ref)+";path=/";

        var mb = myBrowser();
        if ("Safari" == mb) {
            if (typeof(Storage) !== "undefined") {
                var token = localStorage.token;
                var create_time = localStorage.tokenTime;
                if(token!= "undefined") {
                    <%--if (localStorage.thisNow == 0) {--%>
                        <%--go("/userToken?biu=1&token=" + token + "&create_time=" + create_time);--%>
                        <%--return false;--%>
                    <%--}--%>
                    <%--if (localStorage.thisNow == 1) {--%>
                        <%--localStorage.thisNow = 0;--%>
                        <%--go("<%=index%>");--%>
                    <%--}--%>
                }
            } else {
                if(getCookie("token")!=null){
                    document.cookie = "thisNow=0;path=/";
                    go("/userToken?biu=1");
                    return false;
                }
                alert("卖家中心暂时不支持低版本Safari浏览器");
                go("<%=index%>");
            }
        } //判断是否Safari浏览器

        var thisNow = getCookie("thisNow");
        var thisNow = GetQueryString("thisNew");
//        console.log(thisNow);
//        return false;
        if(thisNow==1){
            thisNow = 0;
        }
        if (thisNow == null || thisNow == 0) {
            document.cookie = "thisNow=0;path=/";
            go("/userToken?biu=1");
            return false;

        }
        if (thisNow == 1) {//返回父应用
            document.cookie = "thisNow=0;path=/";
            go("<%=index%>");
        }
    });
    function go(sURL) {
        if (navigator.userAgent.indexOf("MSIE") != -1) {
//            location.href = sURL;
            window.navigate(sURL);
        } else {
            window.location.href = sURL;
        }
    }
</script>
</html>

子应用的控制器“/userToken“

        String token = getPara("token");
        String create_time = getPara("create_time");
        Integer biu = getParaToInt("biu", 1);
        if (biu == 0) {
            setCookie("token", String.valueOf(token), 1000 * 60 * 60);//http setCookie
            setCookie("create_time", String.valueOf(create_time), 1000 * 60 * 60);//http setCookie
            setCookie("thisNow", String.valueOf(0), 1000 * 60 * 60);
            setAttr("token",token.toString());
            setAttr("create_time",create_time.toString());
            setAttr("thisNow",0);
            renderJsp("P3P.jsp");//转向资源
        } else {
            token = token==null||token.equals("undefined")?getCookie("token"):token;
            String newTime = "1";
            try {
                newTime = URLDecoder.decode(getCookie("create_time"),"utf-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            create_time = create_time==null||create_time.equals("undefined")?newTime:create_time;
            System.out.println("token:" + token + ",create_time:" + create_time);
            User user = getBuyUser(); //获取当前登录用户
            if (user != null) {//登陆
                Integer uid = user.getId();
                shopAllow(uid, biu);//业务跳转
            } else {
                UserToken userToken = UserToken.dao.getByToken(token, create_time);//登陆检测
                if (userToken != null) {
                    Integer userId = userToken.getInt("uid");
                    try {
                        DESUtils des = new DESUtils("Token");//自定义密钥
                        String p = userToken.get("t_password").toString();
                        String password = des.decrypt(p);//解密
                        String account = userToken.getStr("mobile") == null ? userToken.getStr("email") : userToken.getStr("mobile");
                        login(account, password);//登陆
                        userToken = UserToken.dao.getByUid(userId);
                        userToken.set("t_password", "").set("token", "").update();//密匙失效
                        shopAllow(getBuyUser().getId(), biu);//业务跳转
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                } else {
                    redirect(EnumConst.userToken.INDEX.getValue() + "/views/login/login.html?biu=1&link=" + EnumConst.userToken.Login.getValue());//EnumConst.userToken.Login.getValue())子应用的中转页面 EnumConst.userToken.INDEX.getValue() 父应用
                }

            }
        }
private void shopAllow(Integer uid, Integer biu) {

        if (biu == 1) {
            setCookie("thisNow", String.valueOf("1"), 1000 * 60 * 60);
        }
        //业务跳转
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值