1.使用Struts2的表单标签,其中需要增加token标签。
<s:token/>标签其实底层是这么实现的:
首先会在form表单里产生一个hidden类型的<input>标签:
<input type="hidden" name="token" value="9AUOGRO10QB77EAJ65NYE6ROHWZ3IIQN" />
然后struts2会生成一个全局唯一的字符串token放置在session会话中。
表单提交时检查表单提交的token和session会话中的值是否相同,相同则执行action,执行完成之后会修改session中token的值。
否则会被拦截到
invalid.token结果中。因此还需在action中声明invalid.token结果视图。
如下:
<%@ page language="java" contentType="text/html; charset=utf-8" import="java.util.*" pageEncoding="utf-8"%> <%@ taglib uri="/struts-tags" prefix="s"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Insert title here</title> </head> <body> <s:form action="myAction" method="post" namespace="/"> 名字:<s:textfield name="name"></s:textfield><br> <s:token/> <s:submit value="提交"></s:submit> </s:form> </body> </html>
这里需要注意一点:struts2中所有action默认使用defaultStack拦截器栈,struts2的很多功能都是依靠拦截器栈中的拦截器的支撑。
如果手动在aciton中添加拦截器,这时会导致acton丢失defaultStack拦截器栈,所有我们在手动添加拦截器的时候,还需要手动添加defaultStack拦截器栈
如下:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <package name="default" namespace="/" extends="struts-default"> <action name="myAction" class="com.itheima.action.MyToken"> <span style="color:#FF0000;"><interceptor-ref name="defaultStack"></interceptor-ref></span> <span style="color:#FF0000;"><interceptor-ref name="token"></interceptor-ref></span> <span style="color:#FF0000;"><result name="invalid.token">/index.jsp</result></span> <result>/success.jsp</result> </action> </package> </struts>
<%@ page language="java" contentType="text/html; charset=utf-8" import="java.util.*" pageEncoding="utf-8"%> <%@ taglib uri="/struts-tags" prefix="s"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Insert title here</title> </head> <body> <span style="color:#FF0000;"><s:actionerror/></span> <s:form action="myAction" method="post" namespace="/"> 名字:<s:textfield name="name"></s:textfield><br> <s:token/> <s:submit value="提交"></s:submit> </s:form> </body> </html>因为显示的是英文,我们可以通过修改国际化文件struts.messages.invalid.token 的键值,提供自己定制的错误信息。比如:struts.messages.invalid.token= 您已经提交了表单,请不要重复提交。
原文地址:http://blog.csdn.net/m631521383/article/details/40784755