- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章spring+html5实现安全传输随机数字密码键盘由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
随着互联网的飞跃式发展,移动支付已越来越受欢迎并且已成为常态,很多三方支付公司推出了很多支付方式如快捷支付、认证支付、扫码支付等等。快捷支付和认证支付可分为移动app控件和移动HTML5网页。用户第一次使用快捷支付或认证支付进行支付的时候,需先绑定银行卡。在绑定银行卡的过程中,需要验证银行卡信息。不同银行、不同银行卡验证的要素不一样,有些需要验证四要素,有的需要验证八要素。对于需要验证银行卡的交易密码的情况,怎样保证交易密码的安全不被别人所窃取呢?为了保证交易密码不在传输过程中被窃取,出现了安全传输随机数字密码键盘.
安全传输随机数字密码键盘怎么实现呢?今天给大家详细的介绍安全传输随机数字密码键盘的原理和代码实现。下图是实现的数 。
字键盘效果:
1、实现原理 。
用户点击“交易密码”输入框,页面异步向后台发送“获取密码键盘”的请求,后台接收到请求之后随机生成“1234567890与随机密文的对应关系”和“随机密文”和“1234567890图片“的对应关系,然后把它们关系放入dto实例中并放入redis中,最后把随机密文以集合的方式返回到页面,页面js获取到密文集合后以循环的方式向后台请求对应的数字图片流,并展示在页面.
当用户点击数字键盘中的数字图片,就会把图片对应的密文放入到pkey隐藏输入框中,多个数字以逗号隔开,当点击支付的时候,就会把peykey隐藏输入框的值传入到后台,后台从redis中取出“密文”与“1234567890数字“的对应关系,就取出了对应交易密码.
2、具体实现 。
1).HTML5页面 。
页面主要展示密码输入框和支付按钮,需要导入JQuery、bootstrap及pwdkey.js等。下面是具体代码:
1
2
3
4
5
6
7
8
9
10
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
|
<%@ page language="java" import="java.util.*"
contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ page pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
%>
<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" "http://www.wapforum.org/DTD/xhtml-mobile10.dtd">
<
html
>
<
head
>
<
meta
name
=
"viewport"
content
=
"width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=0"
/>
<
meta
http-equiv
=
"Cache-Control"
CONTENT
=
"private,must-revalidate"
>
<
link
rel
=
"stylesheet"
href='<c:url
value
=
"/js/bootstrap/css/bootstrap.min.css"
/>'>
<!-- 引入js脚本文件 begin -->
<!--[if lt IE 9]>
<script src="http://cdn.bootcss.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<script src="http://cdn.bootcss.com/respond.js/1.4.2/respond.min.js"></script>
<![endif]-->
<
script
src
=
"<c:url value="
/js/JQuery/jquery-1.10.0.min.js"/>"></
script
>
<
script
src
=
"<c:url value="
/js/bootstrap/js/bootstrap.min.js"/>"></
script
>
<
script
type
=
"text/javascript"
src
=
"<c:url value="
/js/pwdkey.js"/>"></
script
>
<
title
>xxx付款</
title
>
<
style
type
=
"text/css"
>
.input-out {
padding-top: 20px;
}
.btn-out {
margin:30px 10px;
}
.btn-out button {
width: 100%;
background: #5CACEE;
border: #5CACEE;
color: #fff;
height: 50px;
border-radius: 3px;
font-size: 18px;
font-family: "Microsoft Yahei", "??????", SimHei, Tahoma, Arial, Helvetica, STHeiti;
}
.keyboard {
background: #fff;
}
.keyboard table {
width:100%;
text-align:center;
}
.keyboard table td {
padding: 15px;
}
.keyboard table a,
.keyboard table a:hover,
.keyboard table a:focus {
color: #333;
text-decoration: none;
}
.input-out label {
color:#D2D1D1;
font-weight: normal;
font-size: 16px;
}
.bottom {
color:#888888;
margin-bottom: 15px;
text-align:center;
margin-top:100px;
}
.bottom a {
color:#888888;
}
.bottom img {
vertical-align: middle;
width: 18px;
}
</
style
>
</
head
>
<
body
>
<
form
action="<%=path%>/pay" method="post" id="from">
<
div
class
=
"content"
>
<
div
class
=
"input-out pass-label"
style
=
"border-bottom: 1px solid #ddd;padding-left: 12px;"
random
=
"2321321321"
path="<%=path%>" >
<
label
id
=
"pin"
>交易密码</
label
>
</
div
>
</
div
>
<
div
class
=
"btn-out"
>
<
button
type
=
"button"
class
=
"btn btn-default"
ontouchstart
=
"check();"
id
=
"pay"
>支付</
button
>
</
div
>
</
form
>
<
div
class
=
"bottom"
id
=
"bottom-out"
>
<
img
src
=
"<c:url value="
/images/phone.png"/>" />
<
span
>客服电话:4000-xxx-xxx</
span
>
</
div
>
<!-- jianpan-->
<
div
class
=
"keyboard"
style
=
"display:none;"
id
=
"keyboard"
>
<
table
class
=
"table-bordered"
id
=
"key_table"
>
</
table
>
</
div
>
</
body
>
</
html
>
|
2).密码键盘js代码 。
用户点击“交易密码”输入框,页面异步向后台发送“获取密码键盘”的请求,后台接收到请求之后把随机密文以集合的方式返回到页面,页面js获取到密文集合后以循环的方式向后台请求对应的数字图片流并展示在页面。具体代码如下:
1
2
3
4
5
6
7
8
9
10
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
|
$(document).ready(
function
() {
$(
"#pay"
).removeAttr(
"disabled"
);
$(
"input"
).click(
function
() {
hideKey();
});
$(
"button"
).click(
function
() {
hideKey();
});
$(
".pass-label"
).click(
function
() {
var
rangdom = $(
this
).attr(
"random"
);
var
path = $(
this
).attr(
"path"
);
pwdkey(
this
, rangdom, path);
});
window.addEventListener(
"onorientationchange"
in
window ?
"orientationchange"
:
"resize"
, hengshuping,
false
);
});
function
hengshuping() {
if
(window.orientation == 180 || window.orientation == 0) {
$(
"div#keyboard td"
).each(
function
() {
$(
this
).css(
"padding"
,
"15px"
);
});
}
if
(window.orientation == 90 || window.orientation == -90) {
$(
"div#keyboard td"
).each(
function
() {
$(
this
).css(
"padding"
,
"8px"
);
});
}
window.scrollTo(0, $(
".pass-label"
).offset().top);
}
function
pwdkey(obj, rangdom, path) {
$(
'.keyboard'
).addClass(
"navbar-fixed-bottom"
);
$(
'.keyboard'
).css({
"z-index"
:
"9999"
});
if
(rangdom ==
null
|| rangdom ==
""
) {
alert(
"无法加载密码键盘,请刷新后重试!"
);
return
false
;
}
if
($(
"#pkey"
).val() ==
null
|| $(
"#pkey"
).val() ==
"undefined"
) {
$(obj)
.html(
$(obj).html()
+
'<input type="hidden" name="pkey" id="pkey" />'
);
}
$(
"#pin"
).html(
"交易密码"
);
setCssNomal();
$(
"#pkey"
).val(
""
);
$
.ajax({
type :
'post'
,
url : path +
"/common/pkey.do"
,
cache :
false
,
async :
false
,
data : {
rangdom : rangdom
},
success :
function
(data) {
if
(data ==
null
|| data ==
""
|| data ==
"undefined"
|| data.length != 10) {
alert(
"无法加载密码键盘,请刷新后重试!"
);
return
false
;
}
else
{
var
key_table = $(
"#key_table"
);
key_table.html(
""
);
var
content =
'<tr>'
;
for
(
var
i = 0; i < 12; i++) {
if
((i + 1) % 3 == 0 && i != 0 && i <= 5) {
content = content
+
'<td style="width:33%;" key="'
+ data[i]
+
'" ontouchstart="return ontouch(this);"><img src="'
+ path
+
'/common/getKey.do?key='
+ data[i]
+
'&rangdom='
+ rangdom
+
'" style="height:20px;" id="key_img"/></td></tr><tr>'
;
}
else
if
(i <= 7) {
content = content
+
'<td style="width:33%;" key="'
+ data[i]
+
'" ontouchstart="return ontouch(this);"><img src="'
+ path
+
'/common/getKey.do?key='
+ data[i]
+
'&rangdom='
+ rangdom
+
'" style="height:20px;" id="key_img"/></td>'
;
}
else
if
(i == 8) {
content = content
+
'<td style="width:33%;" ontouchstart="return deleteOne();"><img src="'
+ path
+
'/images/keys/delete.png" style="height:20px;" id="key_img"/></td>'
+
'</tr><tr>'
;
}
else
if
(i < 11) {
content = content
+
'<td style="width:33%;" key="'
+ data[i - 1]
+
'" ontouchstart="return ontouch(this);"><img src="'
+ path
+
'/common/getKey.do?key='
+ data[i - 1]
+
'&rangdom='
+ rangdom
+
'" style="height:20px;" id="key_img"/></td>'
;
}
else
{
content = content
+
'<td style="width:33%;" onclick="return _ok();"><img src="'
+ path
+
'/images/keys/ok.png" style="height:20px;" id="key_img"/></td>'
+
'</tr>'
;
}
}
key_table.html(content);
setTimeout(
function
() {
$(
"#keyboard"
).show();
}, 600);
hengshuping();
}
},
error :
function
() {
alert(
"无法加载键盘,请刷新后重试!"
);
}
});
}
function
ontouch(obj) {
var
pkey = $(
"#pkey"
).val();
var
key = $(obj).attr(
"key"
);
if
(pkey ==
""
) {
$(
"#pin"
).html(
""
);
}
var
content = $(
"#pin"
).html();
if
(content !=
""
&& content.length >= 6) {
return
false
;
}
if
(pkey !=
""
) {
key =
","
+ key;
}
pkey = pkey + key;
$(
"#pkey"
).val(pkey);
$(
"#pin"
).append(
"*"
);
setCssKey();
}
function
deleteOne() {
var
pkey = $(
"#pkey"
).val() +
""
;
if
(pkey ==
""
) {
return
false
;
}
var
local = pkey.lastIndexOf(
","
);
if
(local == -1) {
$(
"#pkey"
).val(
""
);
$(
"#pin"
).html(
"交易密码"
);
setCssNomal();
}
else
{
pkey = pkey.substring(0, local - 1);
var
content = $(
"#pin"
).html();
content = content.substring(0, content.length - 1);
$(
"#pkey"
).val(pkey);
$(
"#pin"
).html(content);
}
}
function
_ok() {
$(
"#key_table"
).html(
""
);
$(
"#keyboard"
).hide();
}
function
showkey() {
$(
"#keyboard"
).show();
}
function
hideKey() {
$(
"#key_table"
).html(
""
);
$(
"#keyboard"
).hide();
}
function
setCssKey() {
$(
"#pin"
).css({
"font-size"
:
"18px"
,
"color"
:
"#030303"
,
"font-weight"
:
"normal"
,
"letter-spacing"
:
"1px"
});
}
function
setCssNomal() {
$(
"#pin"
).css({
"font-size"
:
"16px"
,
"color"
:
"#D2D1D1"
,
"font-weight"
:
"normal"
});
}
|
3).获取密码键盘后台方法 。
该方法将随机生成“1234567890与随机密文的对应关系”和“随机密文”和“1234567890图片“的对应关系,然后把它们关系放入dto实例中并放入redis中,最后把随机密文以集合的方式返回到页面。具体代码如下:
获取密码键盘:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
/**
*
* @Description: 获取密码键盘
* @param request
* @param rangdom 随机字符串
* @return
*
*/
@SuppressWarnings
(
"unchecked"
)
@ResponseBody
@RequestMapping
(value =
"common/pkey.do"
, method = RequestMethod.POST)
public
Object digitkeyboard(HttpServletRequest request, String rangdom) {
LOG.info(
"[获取密码键盘digitkeyboard][parames:outOrderId="
+ rangdom +
"]"
);
try
{
if
(StringUtils.isBlank(rangdom)) {
return
""
;
}
PwdKeyDto pwdkey = PwdKeyUtils.digitkeyboard();
redisUtil.set(
"pwdkey_"
+ rangdom, pwdkey,
redisUtil.getDigitkeyimeOut());
return
pwdkey.getRundomKeys();
}
catch
(Exception e) {
LOG.error(
"[获取密码键盘digitkeyboard][error:{}"
,e);
}
return
""
;
}
|
密码PwdKeyDto: 。
1
2
3
4
5
6
7
8
9
10
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
|
/**
*
* @ClassName: PwdKeyDto
* @Description: 密码映射Dto
* @author xxxx <a target="_blank" href="mailto:xxxx@xxx.com" rel="external nofollow" >xxxx@xxx.com</a>
* @date 2015年6月25日 上午11:01:20
*
*/
public
class
PwdKeyDto
implements
Serializable{
/**
描述*/
private
static
final
long
serialVersionUID = 1L;
private
List<String> rundomKeys;
// 随机Keys
private
Map<String, String> valueKeyMaps;
// 密文和明文映射
private
Map<String, String> imgKeyMaps;
// 密文和明文映射
public
PwdKeyDto() {
super
();
// TODO Auto-generated constructor stub
}
public
List<String> getRundomKeys() {
return
rundomKeys;
}
public
void
setRundomKeys(List<String> rundomKeys) {
this
.rundomKeys = rundomKeys;
}
public
PwdKeyDto(List<String> rundomKeys, Map<String, String> valueKeyMaps,
Map<String, String> imgKeyMaps) {
super
();
this
.rundomKeys = rundomKeys;
this
.valueKeyMaps = valueKeyMaps;
this
.imgKeyMaps = imgKeyMaps;
}
public
Map<String, String> getValueKeyMaps() {
return
valueKeyMaps;
}
public
void
setValueKeyMaps(Map<String, String> valueKeyMaps) {
this
.valueKeyMaps = valueKeyMaps;
}
public
Map<String, String> getImgKeyMaps() {
return
imgKeyMaps;
}
public
void
setImgKeyMaps(Map<String, String> imgKeyMaps) {
this
.imgKeyMaps = imgKeyMaps;
}
}
|
生成键盘的PwdKeyUtils工具类:
1
2
3
4
5
6
7
8
9
10
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
|
/**
*
* @ClassName: PwdKeyUtils
* @Description: 密码处理工具类
* @author xxxx <a target="_blank" href="mailto:xxxx@xxxx.com" rel="external nofollow" >xxxx@xxxx.com</a>
* @date 2015年6月25日 上午11:03:24
*
*/
public
class
PwdKeyUtils {
private
final
static
Map<String, String> imagesValueMap;
/**
*
* @Description: 获取密码键盘映射关系
* @param imagesValueMap
* @return
*
*/
static
{
imagesValueMap =
new
HashMap<String, String>();
imagesValueMap.put(
"0"
,
"images/keys/0.png"
);
imagesValueMap.put(
"1"
,
"images/keys/1.png"
);
imagesValueMap.put(
"2"
,
"images/keys/2.png"
);
imagesValueMap.put(
"3"
,
"images/keys/3.png"
);
imagesValueMap.put(
"4"
,
"images/keys/4.png"
);
imagesValueMap.put(
"5"
,
"images/keys/5.png"
);
imagesValueMap.put(
"6"
,
"images/keys/6.png"
);
imagesValueMap.put(
"7"
,
"images/keys/7.png"
);
imagesValueMap.put(
"8"
,
"images/keys/8.png"
);
imagesValueMap.put(
"9"
,
"images/keys/9.png"
);
}
public
static
PwdKeyDto digitkeyboard() {
List<String> rundomKeys =
new
ArrayList<String>();
// 随机key映射
Map<String, String> valueKeys =
new
HashMap<String, String>();
// 密文和明文映射
Map<String, String> imgKeyMaps =
new
HashMap<String, String>();
// 密文和图片映射
List<String> keys =
new
ArrayList<String>();
for
(
int
i =
0
; i <
10
; i++) {
keys.add(i +
""
);
}
for
(
int
i =
0
; i <
10
; i++) {
Random r =
new
Random();
int
index = r.nextInt(keys.size());
String key = keys.get(index);
keys.remove(index);
String randomkey = randomKey(
24
);
rundomKeys.add(randomkey);
valueKeys.put(randomkey, key);
imgKeyMaps.put(randomkey, imagesValueMap.get(key));
}
PwdKeyDto dto =
new
PwdKeyDto(rundomKeys, valueKeys, imgKeyMaps);
return
dto;
}
/**
*
* @Description:获取动态key
* @param num
* key位数
* @return
*
*/
public
static
String randomKey(
int
num) {
StringBuffer sb =
new
StringBuffer(
""
);
char
[] chars = {
'0'
,
'1'
,
'2'
,
'3'
,
'4'
,
'5'
,
'6'
,
'7'
,
'8'
,
'9'
,
'A'
,
'B'
,
'C'
,
'D'
,
'E'
,
'F'
,
'G'
,
'H'
,
'I'
,
'J'
,
'K'
,
'L'
,
'M'
,
'N'
,
'O'
,
'P'
,
'Q'
,
'R'
,
'S'
,
'T'
,
'U'
,
'V'
,
'W'
,
'X'
,
'Y'
,
'Z'
,
'a'
,
'b'
,
'c'
,
'd'
,
'e'
,
'f'
,
'g'
,
'h'
,
'i'
,
'j'
,
'k'
,
'l'
,
'm'
,
'n'
,
'o'
,
'p'
,
'q'
,
'r'
,
's'
,
't'
,
'u'
,
'v'
,
'w'
,
'x'
,
'y'
,
'z'
};
for
(
int
i =
0
; i < num; i++) {
int
id = (
int
) Math.ceil(Math.random() *
60
);
sb.append(chars[id]);
}
return
sb.toString();
}
/**
*
* @Description:解密pin
* @param request
* @param pin
* @return
*
*/
public
static
String decryptPinData(HttpServletRequest request,
String ciphertextpin)
throws
Exception {
if
(StringUtils.isNotBlank(ciphertextpin)) {
Map<String, String> valuekeys = (Map<String, String>) request
.getSession().getAttribute(
"valuekeys"
);
if
(valuekeys ==
null
|| valuekeys.size() !=
10
) {
throw
new
Exception();
}
String[] ciphertextpins = ciphertextpin.split(
","
);
StringBuffer sb =
new
StringBuffer(
""
);
for
(String ctpin : ciphertextpins) {
sb.append(valuekeys.get(ctpin));
}
}
return
null
;
}
}
|
4).获取图片流后台方法 。
用户页面获取到随机密文集合后以循环的方式向后台请求该方法获取对应的数字图片流。具体代码如下:
1
2
3
4
5
6
7
8
9
10
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
|
/**
* 获取key图片
*
* @throws Exception
*/
@RequestMapping
(value =
"/common/getKey.do"
, method = RequestMethod.GET)
public
void
getKey(String key, String rangdom, HttpServletRequest request,
HttpServletResponse response)
throws
Exception {
LOG.info(
"[获取密码键盘key(getKey)][parms:key="
+ key +
"]"
);
PwdKeyDto pwdkey = (PwdKeyDto) redisUtil.get(
"pwdkey_"
+ rangdom);
if
(pwdkey ==
null
|| pwdkey.getImgKeyMaps() ==
null
) {
LOG.error(
"获取图片[getKey]:未获取到对应的键盘的映射关系"
);
throw
new
Exception();
}
Map<String, String> imagekeys = pwdkey.getImgKeyMaps();
String path = imagekeys.get(key);
String rootPath = request.getSession().getServletContext()
.getRealPath(
"/"
);
path = rootPath + path;
LOG.info(
"[获取密码键盘key(getKey)][path="
+ path +
"]"
);
if
(StringUtils.isNotEmpty(path)) {
try
{
InputStream fis =
new
FileInputStream(
new
File(path));
BufferedInputStream bis =
new
BufferedInputStream(fis);
OutputStream fos = response.getOutputStream();
BufferedOutputStream bos =
new
BufferedOutputStream(fos);
String fileName =
"image."
;
String[] strs = path.split(
"\\."
);
fileName = fileName + strs[strs.length -
1
];
setFileDownloadHeader(request, response, fileName);
int
byteRead =
0
;
byte
[] buffer =
new
byte
[
8192
];
while
((byteRead = bis.read(buffer,
0
,
8192
)) != -
1
) {
bos.write(buffer,
0
, byteRead);
}
bos.flush();
fis.close();
bis.close();
fos.close();
bos.close();
}
catch
(Exception e) {
LOG.error(
"获取图片[path:"
+ path +
"])失败:"
+ e.toString(), e);
}
}
}
|
5).用户支付 。
当用户点击数字键盘中的数字图片,就会把图片对应的密文放入到pkey隐藏输入框中,多个数字以逗号隔开,当点击支付的时候,就会把peykey隐藏输入框的值传入到后台,后台从redis中取出“密文”与“1234567890数字“的对应关系,就取出了对应交易密码。具体代码如下:
页面提交支付js
1
2
3
4
5
6
7
8
9
10
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
|
function check()
{
hideKey();
var pin=
""
;
pin=$(
"#pkey"
).val();
if
(pin==
""
||pin==undefined)
{
bool=
false
;
alert(
"请输入交易密码"
);
return
false
;
}
else
{
var keys=pin.split(
","
);
if
(keys.length!=
6
)
{
alert(
"请输入6位交易密码"
);
return
false
;
}
}
$.ajax({
type :
'post'
,
url :
"test/pay.do"
,
data : {
random:
"2321321321"
,
pin:pin
},
cache :
false
,
success : function(data) {
if
(data.success)
{
alert(data.message);
}
else
{
}
},
error : function(){
alert(
"系统异常,请重试!"
);
}
});
}
|
后台解析密文方法:
1
2
3
4
5
6
7
8
9
10
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
|
/**
*
* @Description: 支付
* @param pin 交易密码密文
* @param random 随机码
* @return
*
*/
@ResponseBody
@RequestMapping
(value =
"/test/pay.do"
, method = RequestMethod.POST)
public
Object pay(String pin,String random, HttpServletRequest request) {
try
{
LOG.info(
"[支付(pay)][params:pin="
+ pin +
",random="
+random+
"]"
);
if
(StringUtils.isNotBlank(pin)) {
StringBuffer sb =
new
StringBuffer(
""
);
PwdKeyDto pwdkey = (PwdKeyDto) redisUtil.get(
"pwdkey_"
+ random);
if
(pwdkey ==
null
|| pwdkey.getValueKeyMaps() ==
null
) {
return
new
Result(
false
,
"密码键盘已失效,请重新输入密码"
);
}
Map<String, String> valuekeys = pwdkey.getValueKeyMaps();
String[] pins = pin.split(
","
);
if
(pins.length !=
6
) {
return
new
Result(
false
,
"交易密码位数不对"
);
}
for
(String pinKey : pins) {
String val = valuekeys.get(pinKey);
if
(StringUtils.isBlank(val)) {
return
new
Result(
false
,
"密码键盘已失效,请重新输入密码"
);
}
sb.append(val);
}
/**
* sb.toString()就是明文交易密码,下面就是具体的支付操作
*/
}
return
new
Result(
true
,
"成功"
);
}
catch
(Exception e) {
LOG.error(
"[支付(pay)][error:{}]"
,e);
return
new
Result(
false
,
"支付异常,请重试!"
);
}
}
|
以上就是对使用spring+html5实现安全传输随机数字密码键盘的介绍和代码实现,大家有什么疑问或设计的不合理的地方可以一起讨论.
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
最后此篇关于spring+html5实现安全传输随机数字密码键盘的文章就讲到这里了,如果你想了解更多关于spring+html5实现安全传输随机数字密码键盘的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
大家好, 我看到了来自 java 项目中的 jsp 页面。 想问一下这些html标签有什么区别。 请多多指教。 示例代码如下: 最佳答案 使用struts-html标签库,其中只是普
我有一个页面,我正在从电子邮件中读取 HTML。 有时,来自电子邮件的文本包含 HTML 和 CSS,它完全改变了我的页面样式。 我不希望我的页面样式因此受到影响。我如何严格阅读特定 div(框)内的
我知道有类似的问题,但我想对我的特定代码进行一些输入。 我有一个图像,我将其切成 9 块,并创建了一个 3x3 HTML 表来显示它。 但是我的表在行之间有空格,但在列之间没有空格。我没有使用任何 C
编辑:Waylan 的回答成功了!谢谢! 我正在尝试压缩文档的 .html 文件以发送给客户。目标是获得与浏览实际网站相同的体验。 打开 .html 文件时,单击的任何链接都会转到父文件夹,而不是特定
编辑:Waylan 的回答成功了!谢谢! 我正在尝试压缩文档的 .html 文件以发送给客户。目标是获得与浏览实际网站相同的体验。 打开 .html 文件时,单击的任何链接都会转到父文件夹,而不是特定
这是 question 的扩展.我正在尝试解析嵌入在 Blogger 博客的 XML 备份中的 HTML 片段,并用 InDesign 标签重新标记它们。 Blogger 并未对其任何帖子的 HTML
我知道在 html 中元素之间的换行符被视为空格,但我认为当您尝试使用响应式布局时这非常可怕。 例如,这里我们有预期和正确的行为,但要获得它,我必须删除元素之间的 html 中的换行符: https:
我正在尝试将文本文件显示为 html。我正在使用 ionic 。我正在发送一个 html 格式的响应,但在一个文本文件中发送到配置文件页面。它在 .ts 页面的变量名中。 @Component({
假设我有一个 html 文档: test 我想在浏览器中显示该代码。然后我会创建类似的东西: <html>test<html> 为了在中间制作 gubbins,我有一个函数
HTML 元素和 HTML 标签有什么区别?渲染有什么区别吗?使用标签或元素时有什么特殊注意事项吗? 最佳答案 是一个标签,特别是一个开始标签 也是一个标签,一个结束标签 This is a para
我有这个表格的模态形式。该表正在填充大量数据,但我不想分页。相反,我想以模式形式降低表格的高度并为表格添加溢出。下面是我的代码,但它不起作用。 请问我该如何实现? CSS #table{
我记得有一个 Linux 命令可以从给定的 URL 返回 HTML 代码。您可以将 URL 作为此命令的参数,然后返回 HTML 代码,而不是在浏览器中输入 URL。 哪个命令执行此操作? 最佳答案
我有一个 html 页面,我想在其中包含另一个有很多链接的 html 页面。我能够使用 iframe 实现它,但我希望 iframe 内的页面具有与原始页面相同的文本和链接颜色属性,我不想要滚动条,我
我正在使用 HTML 写一本书。如果我把它写在一个 html 文件中,整个代码就会变长,所以我想将每一章保存到不同的文件中,然后将它们加载到主 html 中。我的意思是有像 chapter1.html
在显示之前,我必须将一个网站重定向到另一个网站。我试过使用 .htaccess,但它给我带来了问题。我也使用过 javavscript 和 meta,但在加载我要从中传输的页面之前它不起作用。帮助?
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
如何打印“html”标签,包括“”?如何在不使用文本区域和 Javascript 的情况下对任何标签执行此操作? 最佳答案 使用HTML character references : <html
我需要将 Ruby on Rails 应用程序中的 html.slim 文件转换为 html.erb。有什么简单的方法吗?我尝试了 Stack Overflow 和其他网站中列出的许多选项。但对我没有
这个问题在这里已经有了答案: Is it necessary to write HEAD, BODY and HTML tags? (6 个答案) 关闭 8 年前。 我在 gitHub 上找到了这个
如果不允许通过 JavaScript 进行额外的 DOM 操作,我正在寻找可以加载外部资源的元素列表。我正在尝试使用 HTML 查看器托管来自第三方的电子邮件,当发生这种情况时,我需要删除任何自动加载
我是一名优秀的程序员,十分优秀!