用同步器令牌来防止客户端的重复提交,这的确是个好注意! 特别是防止用户在浏览器当中点击后退或者刷新按钮所产生的不良影响。 道理其实很简单,大概流程为:输入请求-->比较值-->处理请求-->生成令牌-->保存令牌--> 准备响应-->外发响应。 在客户请求当中携带服务器前一次响应时发给客户端的令牌,去与服务器端保存的令牌相比较,如果相等,则说明当前是合法提交。而不过不匹配,则可能是重复提交了。 在具体的实现当中以jsp为例,在控制器当中采用servlet来负责管理令牌,将服务器端的令牌保存在session当中,通过每次的请求来更新这个令牌。然后在将要处理的业务逻辑之前判断提交上来的令牌是否合法。如果合法则继续执行,如果不合法,则避免执行正常的操作。 servlet当中生成token代码可如下: public void saveToken(HttpServletRequest request){ 检查令牌合法性HttpSession session=request.getSession(); String token=generateToken(request); session.setAttribute(Constants.TOKEN,token); } public boolean isTokenValid(HttpServletRequest request){ HttpSession session=request.getSession(); String saved=session.getAttribute(Constants.TOKEN); String token=request.getParameter(Constants.TOKEN); if(saved.equals(token)){ return true; } return false; } 在JSP端,通过助手类将当前生成的令牌保存在HTML的表单的隐含域当中。 比如 <input type="hidden" name="TOKEN" value="as8d7j3sk"> 通过这种手段实现起来并不十分复杂。当然这只是防止用户提交的手段之一。其他的方法有待大家不断补充。 来源参考:Core J2ee patterns 2 |
|