Posted on 2007-12-08 00:13
探佚 阅读(311)
评论(2) 编辑 收藏 所属分类:
Java EE技术
在Struts中,表单的提交至少涉及两个Struts动作:
第一个负责把表单显示给用户
第二个负责对用户通过表单提交的数据进行处理
我们在第一个表单动作里生成一个Token(标记)并保存在HttpSession对象和表单的Hidden中各保存一份,在第二个动作里,对比Hidden和HttpSession中的值,如果匹配则正常处理,否则,则属于表单重复提交,总体来说思路与验证码类似。
下面是具体实现步骤:
index.jsp
<a href="redirect.do">添加用户</a>
RedirectAction.java
public class RedirectAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
this.saveToken(request); // 生成Token
return mapping.findForward("input");
}
}
input.jsp
<html:form action="user.do">
userName:<html:text property="userName"/>
<input type="hidden"
name="<%=Constants.TOKEN_KEY%>"
value="<%=session.getAttribute(Globals.TRANSACTION_TOKEN_KEY)%>"/>
<html:submit value="submit"/>
</html:form>
UserAction.java
public class UserAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
// 验证Token
if (!this.isTokenValid(request)) {
return mapping.findForward("error");
}
// 清除Token
this.resetToken(request);
UserForm userForm = (UserForm) form;
// (后面代码与防止表单重复提交无关,不再叙述)
HttpSession session = request.getSession();
Vector userList = (Vector) session.getAttribute("userList");
if (userList == null) {
userList = new Vector();
}
userList.add(userForm.getUserName());
session.setAttribute("userList", userList);
return mapping.findForward("show");
}
}