struts token 机制学习理解.docx
- 文档编号:7763276
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:20
- 大小:26.83KB
struts token 机制学习理解.docx
《struts token 机制学习理解.docx》由会员分享,可在线阅读,更多相关《struts token 机制学习理解.docx(20页珍藏版)》请在冰豆网上搜索。
strutstoken机制学习理解
struts2中使用token避免重复提交
1.在struts.xml中
--配置异常映射,当RegisterAction抛出Exception异常时,向用户显示error.jsp页面-->
2.在页面中加
actionerror/> formaction="register"method="post"> token> token> form> 3. --注意struts2.0拦截器名字为token-sessionstruts2.1.2已经更改为tokenSession--> token: 在活动中检查合法令牌(token),防止表单的重复提交;在 actionerror/>会产生提示信息 token-session: 同上,但是在接到非法令牌时将提交的数据保存在session中;不会在 actionerror/>会产生提示信息 只会在后台发出警告并处理,如下: 警告: FormtokenKO80SIJW4F84034NG5HM1ZBUGOVNY64Ddoesnotmatchthesessiontokennull. 编辑特别推荐: 为struts1.2增加token标签令牌标签[修改更新2009-07-28修复了一个BUG] 2009-07-2317: 28 2009-07-28更新提醒: 修改了一个页面不能存在多个表单的BUG packagecom.tgmsp.CongZhong.tag; importjava.io.IOException; importjavax.servlet.http.HttpServletRequest; importjavax.servlet.jsp.JspException; importjavax.servlet.jsp.JspWriter; importjavax.servlet.jsp.tagext.TagSupport; importorg.apache.struts.Globals; importorg.apache.struts.taglib.html.Constants; importorg.apache.struts.util.TokenProcessor; publicclassTokenTagextendsTagSupport{ publicintdoEndTag()throwsJspException{ HttpServletRequestrequest=(HttpServletRequest)pageContext.getRequest(); JspWriterout=pageContext.getOut(); try{ Objecttmp=null; Stringtoken=(tmp=request.getSession().getAttribute(Globals.TRANSACTION_TOKEN_KEY))==null? TokenProcessor.getInstance().generateToken(request): tmp.toString(); if(token! =null){ request.getSession().setAttribute(Globals.TRANSACTION_TOKEN_KEY,token); out.println(" } }catch(IOExceptione){ e.printStackTrace(); } returnthis.EVAL_PAGE; } } .... 标签配置部分 [CDATA[ 保存Struts令牌 org.apache.struts.action.TOKEN token/> ]]> .... 实例一: 防止表单重复提交 防止重复提交: 有两种方法: 一是使用token拦截器,二是使用tokenSession 第一种方法步骤: 1、 先在页面中放一个令牌。 调用Struts标签,服务器自动分派。 token> token> 2、 在struts.xml文件定义token拦截器。 1. 2. 3. 4. 3、 在struts.xml文件配置有重复提交的错误页面,即: 1. 第二种方法基本与第一种方法基本相同,只不用配置重复提交的错误页面,如果发生重复提交,返回success。 实例二: PreResultInteceptor 这个功能是在Action返回到result时执行。 拦截器-->Action-->Result-->拦截器 实现步骤: 1、 定义一个类实现PreResultListener接口,实现beforeResult方法 1.public class TestPreResultInteceptor implements PreResultListener { 2. 3. public void beforeResult(ActionInvocation arg0, String arg1) { 4. 5. System.out.println("在结果集返回之前执行了beforeResult方法"); 6. 7. } 8. 9.} 2、 自定义一个拦截器与上面定义类进行绑定。 1.public class TestInterceptor extends AbstractInterceptor { 2. 3. @Override 4. 5. public String intercept(ActionInvocation invocation) throws Exception { 6. 7. invocation.addPreResultListener(new TestPreResultInteceptor()); 8. 9. System.out.println("在action执行execute方法之前执行进行拦截"); 10. 11. String result = invocation.invoke(); 12. 13. System.out.println("在action执行execute方法之后执行进行拦截"); 14. 15. return result; 16. 17. } 18. 19.} 20. 很多时候要防止重复提交,比如论坛在发表提问的时候,要是不控制那就可以一直提交~ 使用方法: 论坛为例 ask.do: 为跳到提问页面的action ask.jsp: 为提问页面 askok.do: 为提问成功提交的action askok.jsp: 处理提问之后的跳转的jsp 首先在ask这个action里面加入saveToken(request);这是为了在提问页面即ask.jsp页面生成一个隐藏的表单 在ask。 jsp页面做以下处理: 使用form为 form method="post"action="askok.do"> 因此要引入这个标签否则不会生成这个隐藏表单。 form写法1.1之后不写name没有这个属性但要在struts-config。 xml里面配置这个actionform我们可以定义为question 同时要配置askok这个action里面要写入对应的form 如果要在ask。 jsp这个页面做js处理要用到FORMname的话可以直接写question 因为struts自动生成了这个form的name生成之后的: ask.jsp这个页面自动生成加入FORMname 然后在askok.do里面写if(isTokenValid(ac.getRequest(),true)){ 添加提问 }else { 跳转提示 } Struts1.2之Token重复提交 遇难集中营2007-12-1712: 16: 24阅读130评论0字号: 大中小 --------------------------------------------------------Struts-config.xml xmlversion="1.0"encoding="UTF-8"? > DOCTYPEstruts-configPUBLIC"-//ApacheSoftwareFoundation//DTDStrutsConfiguration1.2//EN""http: //struts.apache.org/dtds/struts-config_1_2.dtd"> attribute="insertForm" input="/insert.jsp" name="insertForm" path="/insert" scope="request" type="org.zhym.struts.action.InsertAction"/> -------------------------------------------------------------------------index.jsp <%@pagelanguage="java"import="java.util.*"pageEncoding="ISO-8859-1"%> <%@tagliburi="http: //jakarta.apache.org/struts/tags-html"prefix="html"%> linkaction="perpareInsert">insert link> ---------------------------------------------------------------------insert.jsp <%@pagelanguage="java"pageEncoding="ISO-8859-1"%> <%@tagliburi="http: //jakarta.apache.org/struts/tags-bean"prefix="bean"%> <%@tagliburi="http: //jakarta.apache.org/struts/tags-html"prefix="html"%>
formaction="/insert"> password: textproperty="password"/> username: textproperty="username"/> email: textproperty="email"/> submit/> cancel/> form> errors/> ---------------------------------------------------------------------InsertAction /* *GeneratedbyMyEclipseStruts *Templatepath: templates/java/JavaClass.vtl */ packageorg.zhym.struts.action; importjavax.servlet.http.HttpServletRequest; importjavax.servlet.http.HttpServletResponse; importorg.apache.struts.action.Action; importorg.apache.struts.action.ActionForm; importorg.apache.struts.action.ActionForward; importorg.apache.struts.action.ActionMapping; importorg.apache.struts.action.ActionMessage; importorg.apache.struts.action.ActionMessages; importorg.zhym.struts.form.InsertForm; /** *MyEclipseStruts *Creationdate: 12-17-2007 * *XDocletdefinition: *@struts.actionpath="/insert"name="insertForm"input="/insert.jsp"scope="request"validate="true" */ publicclassInsertActionextendsAction{ /* *GeneratedMethods */ /** *Methodexecute *@parammapping *@paramform *@paramrequest *@paramresponse *@returnActionForward */ publicActionForwardexecute(ActionMappingmapping,ActionFormform, HttpServletRequestrequest,HttpServletResponseresponse){ InsertForminsertForm=(InsertForm)form;//TODOAuto-generatedmethodstub if(! isTokenValid(request)){ ActionMessageserrors=newActionMessages(); errors.add("insertToken",newActionMessage("error.token")); this.saveErrors(request,errors); this.saveToken(request); returnmapping.getInputForward(); }else{ this.resetToken(request); } returnnull; } } --------------------------------------------------------------------PerpareInsertAction /* *GeneratedbyMyEclipseStruts *Templatepath: templates/java/JavaClass.vtl */ packageorg.zhym.struts.action; importjavax.servlet.http.HttpServletRequest; importjavax.servlet.http.HttpServletResponse; importorg.apache.struts.action.Action; importorg.apache.struts.action.ActionForm; importorg.apache.struts.action.ActionForward; importorg.apache.struts.action.ActionMapping; /** *MyEclipseStruts *Creationdate: 12-17-2007 * *XDocletdefinition: *@struts.actionvalidate="true" */ publicclassPerpareInsertActionextendsAction{ /* *GeneratedMethods */ /** *Methodexecute *@parammapping *@paramform *@paramrequest *@paramresponse *@returnActionForward */ publicActionForwardexecute(ActionMappingmapping,ActionFormform, HttpServletRequestrequest,HttpServletResponseresponse){ //TODOAuto-generatedmethodstub this.saveToken(request); returnmapping.findForward("insert"); } } -----------------------
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- struts token 机制学习理解 机制 学习 理解