时间:2017-1-14 22:29
——普通方法
如何解决表单重复提交?
在JSP页面中生成一个令牌(随机字符串),将其存储到session中,并在表单中携带,提交给服务器。
在服务器端获取请求参数时,同时获取令牌,将她与session中存储的token进行比较,如果没问题,则执行操作。
获取令牌后马上将session中的令牌删除。
示例代码:
JSP页面:
<body>
<%
String token = UUID.randomUUID().toString();
session.setAttribute("token", token);
%>
<form action="${pageContext.request.contextPath}/RegistServlet" method="post">
<input type="hidden" name="token" value="<%=token %>" />
username:<input type="text" name="username" /><br />
<input type="submit" value="注册" />
</form>
</body>
Servlet:
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
String token = (String) request.getSession().getAttribute("token");
String _token = request.getParameter("token");
request.getSession().removeAttribute("token");
if(_token.equals(token)){
System.out.println("注册成功:" + request.getParameter("username"));
} else {
response.getWriter().print("禁止重复提交表单");
}
}
——Struts2解决表单重复提交
在Struts2中解决表单重复提交的问题,可以使用Struts2定义的一个Interceptor:token
token拦截器没有在默认的18个拦截器(defaultStack)中。
步骤
1、在页面中使用token tag标签
> 会在页面上生成一个令牌,并存在于表单中。
2、在<action>标签中引入<token>拦截器。
> <interceptor-ref name="token"/>
3、配置invalid.token视图
> <result name="invalid.token">/index.jsp</result>
4、在页面中使用<s:actionerror />标签显示错误信息。
JSP页面示例代码:
<form action="${pageContext.request.contextPath}/regist" method="post">
<s:token/>
username:<input type="text" name="username" /><br />
<input type="submit" value="注册" />
</form>