使用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);
}
//业务跳转
}