原创
关注
0点赞·757人阅读
<%@ page contentType="text/htmlcharset=GBK"%>
<%@ page language="java" import="java.util.regex.*,
com.excellence.common.OAConstant,
com.excellence.common.UserInfo,
java.util.*,
java.text.SimpleDateFormat," %>
<html>
<head>
<title>XX系统</title>
<meta http-equiv="Content-Type" content="text/htmlcharset=gb2312">
<link rel="stylesheet" href="/common/styles/default/default.css" type="text/css">
</head>
<script language="javascript">
</script>
<script language="JavaScript" src="/oa/javascripts/crypto-js.js"></script>
<body bgcolor="#FFFFFF" text="#000000" leftmargin="0" topmargin="0">
<center>
</center>
</body>
<script type="text/vbscript">
Function str2asc(strstr)
str2asc = hex(asc(strstr))
End Function
Function asc2str(ascasc)
asc2str = chr(ascasc)
End Function
</script>
<script>
<%
UserInfo userInfo = (UserInfo) request.getSession().getAttribute("userInfo ")
String account=""
//获取用户账号
if(userInfo.getAccount()!=null&&!"".equals(userInfo.getAccount()))
account=userInfo.getAccount()
//有效期:格式:yyyy-MM-dd HH:mm:ss 有效期不能设置超过10分钟
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
Date now = new Date()
Date date = new Date(now .getTime() + 600000)
String time = df.format(date)
%>
//sessionid = base64(DES(用户账号&有效期))
//DES key:67HT4WrP
var sessionId = "<%=account%>" + "&" + "<%=time%>"
var mykey = "67HT4WrP"
// DES加密模式:CBC模式/ECB模式
// CBC模式加密
function encryptCBC(text, textKey) {
// 密钥转成16进制的字符串
var key = CryptoJS.enc.Utf8.parse(textKey)
// 加密过程
var encrypted = CryptoJS.DES.encrypt(text, key, {
// iv偏移量为key值
iv: key,
// 模式为CBC
mode: CryptoJS.mode.CBC,
// DES加密padding为Pkcs7
padding: CryptoJS.pad.Pkcs7
})
// 加密返回为字符串密文(加密经过一次base64加密,结果可看结果)
return encrypted.toString()
}
//对字符串中的特殊字符进行UrlEncode转码
function UrlEncode(str){
var ret=""
var strSpecial="!\"#$%&'()*+,/:<=>?[]^`{|}~%"
var tt= ""
for(var i=0i<str.lengthi++){
var chr = str.charAt(i)
var c=str2asc(chr)
tt += chr+":"+c+"n"
if(parseInt("0x"+c) >0x7f){
ret+="%"+c.slice(0,2)+"%"+c.slice(-2)
}else{
if(chr==" ")
ret+="+"
else if(strSpecial.indexOf(chr)!=-1)
ret+="%"+c.toString(16)
else
ret+=chr
}
}
return ret
}
//对sessionid进行加密
var desPass=encryptCBC(sessionId,mykey)
//对加密的sessionid中的特殊字符转码
var desPassEncode=UrlEncode(desPass)
//URL格式:http://xxxxxxxxxxxx?sessionid=&appid=5t7i9e260w6f41b71rt7fd07h9qo9800&redirectUrl=~/Portals/Views/Test/index.html
var url="http://xxxxxxxxxxxx?sessionid="+desPassEncode+"&appid=5t7i9e260w6f41b71rt7fd07h9qo9800&redirectUrl=~/Portals/Views/Test/index.html"
window.close()
window.open(url)
</script>
</html>
登录后复制
注意事项:
1、crypto-js.js使用到了这个js,要记得引入,很多地方可以下载的,除了这里面能用到des加密,也可以从网上找其他的des加密脚本,但是因为des加密模式的问题,要注意调用函数时参数的使用,确定自己要使用的是哪种des加密方法。
2、因为这里实现的是自动登录,涉及到了url的处理,由于使用了加密,密文中会含有特殊字符,直接通过url转跳,要把url中含有的特殊字符进行UrlEncode转码。
3、注意这里des的加密方式,这样进行转跳,跳进去的网站是.net实现的,因为des的加密模式有几种,java,.net等默认的des加密模式有可能不一致,就会导致加密后的密文不一样,所以要确定自己使用哪种模式,或者直接输出加密密文来进行比较。
4、使用js比较方便的地方是因为我这里用的jsp页面,所以对处理的数据可以任意写,而且不会影响后台的使用,我觉得这是js的好处,特别是进行像这种进行类似单点登录,自己系统用的java实现,而别人用的.net,直接用脚本,可以节省时间,不会对自己系统造成什么影响。
5、有一个地方要注意,这里对url进行转码时,使用到了VB脚本的一些函数,这种脚本已经很少有人会用了,而且有些浏览器已经不支持了,百度显示ie11不支持,但是我自己的电脑就是ie11,可以使用,所以这个也不是绝对的,有可能和使用到的函数有关。
6、除了des加密,还有md5,单独的base64加密,这些常用的加密方式,都可以直接用js脚本实现。
7、这里只有des的一种加密模式,还有其他的,crypto-js.js中都有,可以百度下其他加密方法的使用!
安装: npm install crypto-js --save在utils文件夹中新建secret.js文件,内容:
message: 需要加解密的文本
key: 加解密的秘钥
iv: 偏移量,最短8位数,ecb模式不需要此参数
在vue页面引入secret.js文件