Newer
Older
<!DOCTYPE html>
<html>
<%@ page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="ctx" value="${pageContext.request.contextPath}"/>
<%@ page import="cn.hutool.core.util.CharsetUtil" %>
<%@ page import="cn.hutool.http.HttpUtil" %>
<%
//String ssoUrl = "http://222.73.255.10:10318";
String ssoUrl = "http://222.73.73.137:8088";
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
pageContext.setAttribute("ssoUrl", ssoUrl);
String randUrl = ssoUrl + "/GeneratorChallenge";
String rand = "";//随机数
try {
rand = HttpUtil.get(randUrl, CharsetUtil.CHARSET_UTF_8);
} catch (Exception e) {
System.err.println("[SSO单点登录] 读取随机数失败!");
e.printStackTrace();
}
pageContext.setAttribute("rand", rand);
//session.setAttribute("ssoLogin", "true");
%>
<head>
<title>Ukey登录</title>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
<meta http-equiv="cache-control" content="no-store, no-cache, must-revalidate"/>
<meta http-equiv="pragma" content="no-cache"/>
<meta http-equiv="expires" content="0"/>
<script type="text/javascript" src="${ctx}/static/res/jquery-cui/4.0.2/dev/ui/jquery-1.9.1.min.js"></script>
<style type="text/css">
body {
overflow: hidden;
}
</style>
</head>
<body>
<div>
<div>
请稍候...
</div>
<c:if test="${not empty rand}">
<object id="AuthClientCtrl" classid="clsid:C966EBD9-49E9-4E9C-B854-270861C58382" width="0" height="0"></object>
</c:if>
<form id="loginForm" action="${ctx}/login" method="POST">
<input type="hidden" id="loginName" name="username"/>
<input type="hidden" id="pwd" name="password" value="useCaUkey"/>
</form>
</div>
<script type="text/javascript">
var rand = '${rand}';//随机数
$(function () {
//getSignAndToken(rand);
getSignAndTokenByWebsocket(rand);
//loginSso('陈伟');
});
function getSignAndToken(randSign) {
var errorlog;
try {
var signTokenArr = AuthClientCtrl.GetSignAndToken(randSign);
console.log("signTokenArr:", signTokenArr);
if (AuthClientCtrl.lResult != 0) { // 未登录客户端
errorlog = '0';
var errorMsg = AuthClientCtrl.bstrError;
console.log("获取签名数据失败:", errorMsg);
xz();
return;
} else {
var signToken = AuthClientCtrl.bstrSignValAndToken;
//alert("身份票据信息:" + signToken);
getUserInfo(signToken);
}
} catch (e) {
//alert("票据获取异常!!");
if (errorlog != '0') {
//window.location = ''; // 跳转老证书登录
}
throw new Error(e.message);
}
}
/**
* 通过WebSocket获取ukey信息
* @param randSign
*/
function getSignAndTokenByWebsocket(randSign) {
try {
var bodyx = '<?xml version="1.0" encoding="UTF-8"?>' +
'<getsignandtokenreq version="1">' +
'<challenge>' + randSign + '</challenge>' +
'</getsignandtokenreq>';
//var bodylen = sendlen(bodyx);
//套接字单点登录
var ws = new WebSocket('ws://127.0.0.1:30318');
ws.onopen = function (event) {
console.log('已经建立连ws');
ws.send(bodyx);
}
ws.onerror = function (event) {
console.log('ws:error', event);
alert('您没有插ukey或没有安装客户端认证工具!');
xz();
}
ws.onclose = function (event) {
console.log('ws:close');
}
ws.onmessage = function (event) {
var resStr = event.data;
resStr = resStr.split('</tokeninfo>')[0];
resStr = resStr.split('<tokeninfo>')[1];
console.log('signAndToken', resStr);
ws.close();
if (resStr.length > 50) {
getUserInfo(resStr);
} else {
alert('登录失败!');
xz();
}
}
} catch (e) {
throw new Error(e.message);
}
}
//websocket计算body长度
function sendlen(str) {
var s = 0;
for (var i = 0; i < str.length; i++) {
if (str.charAt(i).match(/^[\u4e00-\u9fa5]+$/)) {
s += 3;
} else {
s++;
}
}
s = String(s);
var l = s.length;
var L = 10 - l;
var bodylen = bl(L) + s;
return bodylen;
}
function bl(L) {
var l = '';
for (var i = 0; i < L; i++) {
l = l + '0';
}
return l;
}
function getUserInfo(signToken) {
if (signToken.length > 50) {
//传输随机数、票据信息到后台,对信息进行验证
$.ajax({
type: 'POST',
url: '${ctx}/loginCA/getUserInfo',
dataType: 'json',
data: {
verifyUrl: '${ssoUrl}/VerifyIdentityTicket',
identityticket: signToken,
challenge: rand
},
success: function (data) {
console.log('获取UKey信息', data);
var userName = data.userName;
var userId = data.userId;
var loginName = data.loginName;
//alert(ssotoken);
if (!userName) {
alert('请插入UKey');
xz();
} else if (!loginName) {
alert('无此用户:' + userName);
xz();
} else {
loginSso(loginName);
}
},
error: function (e) {
console.log(e);
}
});
} else {
//alert("signToken 长度错误!!");
xz();
}
}
function xz() {
if (confirm('请您先登录“用户认证客户端”后点击“确定”,点击“取消”则使用账号密码登录')) {
window.location.href = '${ctx}/loginCA.html'; // 新证书登录,登录客户端后刷新本页面
} else {
window.location.href = '${ctx}/login.html'; // 跳转账号密码登录
}
}
/**
* 单点登录
* @param loginName
*/
function loginSso(loginName) {
$('#loginName').val(loginName);
$('#loginForm').submit();
}
</script>
</body>
</html>