jsp中口令卡令牌操作代码实现?
用户登录后,后退又到了登陆界面,但在后退或者前进又到了登陆又的界面!还有刷新时候,服务器显示又有一个同一账户登陆!
用口令卡令牌给演示下,实现后退,在前进之后,显示重新登陆,刷新后显示登陆重复!
------解决方案--------------------很有难度
------解决方案--------------------这个其实实现起来不难,
在当用户登录时,session里保存一个随机生成的数(保持唯一),在需要防止重复提交的页面上hidden域里存放这个值,当提交时,在后台比较这个hidden里的值是否与session中存放的相等,如果相等,则是第一次提交,然后重新设定该随机值,同一页面再提交的话,两个值比较就会不相等了
------解决方案--------------------展示页面的时候在session和request同时加token,提交的时候把token和session的token比较,相同就可以提交,否则报错“不能重复提交”,通过提交后,将session的token重置
在com\zzxy\model\AbstractPage.java中加入,// 加入重复提交相关控制
public abstract String getToken();
public abstract void setToken(String token);
public void saveToken() {
String token = UUID.randomUUID().toString();
this.setToken(token);
this.getSession().setAttribute("token", token);
}
public void resetToken() {
this.getSession().setAttribute("token", null);
}
public boolean isTokenValid(IRequestCycle cycle) {
if (this.getSession().getAttribute("token") != null) {
return this.getSession().getAttribute("token").equals(cycle.getAttribute("token"));
}
return false;
}
public boolean isTokenValid(String token) {
if (this.getSession().getAttribute("token") != null) {
return this.getSession().getAttribute("token").equals(token);
}
return false;
}
然后在使用的时候
if(this.getToken().eq(session.getToken())) {
....
resetToken();
} else {
throw new Exception("不能重复提交!");