生成一个唯一的字符串作为标记,将其存储在会话中并将其作为隐藏的输入值嵌入到JSP的POST形式中,并最终检查servlet是否有效.
基本上:
在会话创建时(HttpSessionListener#sessionCreated()例如):
Set<String> tokens = new HashSet<String>();
event.getSession().setAttribute("tokens", tokens);
Run Code Online (Sandbox Code Playgroud)
关于JSP请求的预处理(HttpServlet#doGet()例如):
String token = UUID.randomUUID().toString();
Set<String> tokens = (Set<String>) request.getSession().getAttribute("tokens");
tokens.add(token);
request.setAttribute("token", token);
Run Code Online (Sandbox Code Playgroud)
在处理JSP本身时:
<input type="hidden" name="token" value="${token}" />
Run Code Online (Sandbox Code Playgroud)
关于表单提交的后处理(HttpServlet#doPost()例如):
String token = request.getParameter("token");
Set<String> tokens = (Set<String>) request.getSession().getAttribute("tokens");
if (!tokens.remove(token)) {
response.sendError(HttpServletResponse.SC_BAD_REQUEST);
return;
}
// ...
Run Code Online (Sandbox Code Playgroud)
我当然假设你的jQuery.post()函数是以一种不引人注目的方式编写的,$.post(form.action, form.serialize(), callback)因此它模拟了正常的同步请求(换句话说,你的表单在禁用JS的情况下工作得很好).
| 归档时间: |
|
| 查看次数: |
1217 次 |
| 最近记录: |