读书笔记5

1、重复提交
2、struts2的token验证
3、用response返回xml时的注意

1、重复提交
(1)应用场景
(1-1)点击提交按钮两次。
(1-2)使用浏览器后退按钮重复之前的操作,导致重复提交表单。
(1-3)刷新页面
(1-4)使用浏览器历史记录重复提交表单。
(1-5)浏览器重复的 HTTP 请求。
(2)解决方法
(2-1)禁掉提交按钮
(2-2)Redirect跳到其他页面--------对用户体验不好
(2-3)在数据库添加约束------------2个用户同时添加相同的记录,肯定有一个没有插入进去
(2-4)ajax提交时出现一个loading模态提示。
(2-5)Struts2的token
(1)和(4)、(5)
2、struts2的token验证
(1)token标签必须与Token或TokenSession一起使用。这2个拦截器都能对标记进行处理。Token拦截器在遇到重复提交情况下,会返回invalid.token
结果并加上一个动作错误。可以覆盖动作错误。
(2)TokenSession拦截器扩展了Token拦截器并提供了一种更复杂的服务.Token Session拦截器不像Token拦截器那种会返回一种特殊的结果并添加一个动作错误,它采取的做法是阻断后续
的提交,而这么做的后果是用户将看到同样的响应,就好像只有一次提交的那样。(根据测试,此方法只提交一次)
步骤:
(1)jsp页面
<s:form action="deleteBoard">
   <s:token/>
   <s:textfield name="board.boardId" label="boardId" maxlength="10" required="true"></s:textfield>
   <s:submit/>
    </s:form>
error页面!<s:actionerror/>
(2)struts2配置

<package name="bbs_board" namespace="/board" extends="struts-default">
<interceptors>
<interceptor-stack name="baiscStack">
<!--interceptor-ref name="token"></interceptor-ref-->
<interceptor-ref name="tokenSession"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
。。。。。。
。。。。。。
<action name="deleteBoard" class="boardAction" method="deleteBoard">
<interceptor-ref name="baiscStack"/>
<result name="deleteBoard" type="redirect">
queryBoard.action
</result>
<!--如果标记无效,就执行invalid.token,如果未通过验证就执行input-->
<result name="invalid.token">../common/error.jsp</result>
<result name="input" type="redirect">../common/input.jsp</result>
</action>
</package>
3、用response返回xml时的注意
设置Response.ContentType为application/xml或text/xml;
text/xml忽略xml头所指定编码格式而默认采用us-ascii编码,而application/xml会根据xml头指定的编码格式来编码.
getHttpServletResponse().setContentType("application/xml;charset=utf-8");

你可能感兴趣的:(重复提交,struts2的token验证)