日期:2014-05-18  浏览次数:20648 次

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("不能重复提交!");