web应用在用户表单操作的时候由于连续点击或者界面提交完刷新等情况,会出现重复提交的问题。下面给出其中一种解决方案:利用session和表单的token值做对比,如果不相等则表示重复提交。
1.自定义标签
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
viway view tag lib
3.0
viway
http://www.viway.com/tag/view
token
com.viway.project.jsp.tag.TokenTag
empty
token
false
2.token class
public class TokenTag extends RequestContextAwareTag {
private static final long serialVersionUID = 4140002821890713194L;
private String token = null;
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
@Override
protected int doStartTagInternal() throws Exception {
String token = UUIDGenerator.getUUID();
pageContext.getSession().setAttribute("token",
token);
setToken(token);
StringBuffer sb = new StringBuffer();
sb.append("
sb.append(" type=\"" + "hidden" + "\"");
sb.append(" name=\"" + "token" + "\"");
sb.append(" value=\"" + token + "\"");
sb.append(" />");
pageContext.getOut().println(sb.toString());
return SKIP_BODY;
}
@Override
public int doEndTag() throws JspException {
return EVAL_PAGE;
}
}
3.在form表单里增加tag
username:
password:
4.在controller层的post方法里增加校验
@RequestMapping(value = "/doregister", method = RequestMethod.POST)
public ModelAndView doRegister(
@ModelAttribute("registerBean") @Valid RegisterBean registerBean,
BindingResult result, HttpServletRequest request) {
ModelAndView mav = new ModelAndView();
if (isDupSubmit(request)) {
logger.warn("重复提交表单");
mav.setViewName("cust/register");
return mav;
}else{
//todo
}
]
//比较token是否一致的方法
public boolean isDupSubmit(HttpServletRequest request) {
String serverToken = (String) request.getSession(false).getAttribute(
"token");
if (serverToken == null) {
return true;
}
String clinetToken = request.getParameter("token");
System.out.println("serverToken:" + serverToken + " clinetToken:" + ""
+ clinetToken);
if (clinetToken == null) {
return true;
}
if (!serverToken.equals(clinetToken)) {
return true;
}
return false;
}