在 MVC.xml 配置文件中为某些请求配置了拦截器,拦截之后生成 CSRFToken 或 验证。如果某个操作仅仅是一个js事件,而不是请求呢?这样的事件无法被拦截。此时,采用 Ajax,它可以主动发起请求。
拦截器无法拦截
有一个登录功能,点击“登录”按钮后,我们能看到在原页面上弹出登录窗口,URL 没有变化。内部的逻辑是,在点击按钮后,前台利用该按钮的id属性,通过 jQuery选择器 触发了点击事件,调用了 $.webox() 方法,在此方法中加载了登录窗口的页面。我们发现,一整套流程下来,完全没有与后台发生交互。既然不能被拦截器拦截,那么何不主动出击,向服务器索要一个 CSRFToken 呢?
Ajax 主动发起请求
很容易地想到了 Ajax。首先在后台编写一个请求类,与拦截生成 CSRFToken 的拦截器功能相似,但是概念和写法不同,一个是拦截器,一个是请求。该请求命名为 SaveCSRFTokenController”,参照其他 Controller 的写法,并在配置文件中注册。
简要代码
服务端
SaveCSRFTokenController.java
String CSRFToken = CSRFTokenManager.getTokenForSession(request.getSession()); try { PrintWriter out = response.getWriter(); out.println(CSRFToken); out.flush(); out.close(); } catch (IOException e) { e.printStackTrace(); }客户端
csrf.js
var url_CSRFToken = "..../SaveCSRFToken/saveCSRFToken.tag?num="+new Date(); $.ajax({ url: url_CSRFToken, success: function(data){ $(".loginForm input[name='CSRFToken']").val(data); } });csrf.html