`
activemq
  • 浏览: 26476 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

struts 令牌.. 验证...

阅读更多
关于Form
突出要求的是Form只是用来存表单数据,只是数据提供者。在这个层次中不要去访问模型层。在Form这块流程中,服务还未响应到response,所以,在其实现中只能传递mapping和request.
Sturts架构中的Action默认读取setXXXX,标签也默认读取getXXX所以,必须规范的实现,同时需使用reset方法来清空数据,如配置中使用 validate=true 那实现中也要编写此方法,其返回为ActionErrors。
使用的方法为:
1 设定各属性值的 getXXX();setXXX(Stirng XXX) 方法。
2 设定reset() 方法,将各属性置为null.
3    调用 public ActionErrors validate(ActionMapping mapping,HttpservletRequest request) 方法
ActionErrors errors = new ActionErrors()
一般来判断 XXX==null ||  xxx.length()<1是否空值来操作  errors.add("XXX",new ActionMessage("资源文件描述")
return erros

关于Action

Action只是个控制角色。它只是来判断模型及其它JAVA文件的计算结果来实现控制转向,不必要放入太多的固定的硬代码在里面。还是为了实现MVC的需要而严格的。这里调用模型层去完成持久化。在Action中如果计划向视图层传递对象时,必须使用setAttribute方法,而且建议此方法参数中的键值为另一对象(一个JAVA文件)的常量,这样也是为了方便控制。实现分离。
如:必须实现execute方法,在方法中再进行比Form简单验证更复杂的验证,实现持久化,然后转向。
使用的一些特殊的方法:
1。设定ActionMessages error = new ActionMessages();
2。根据逻辑判断使用 error.add(ActionMessages.GLOBAL_MESSAGE,new ActionMessage("配置文件"));
3。来判断error是否为空实现转向:
       if(!errors.isEmpty()){
          saveErrors(request,errors);
          return new ActionForward(mapping.getInput());
         }
同样可以使用一个特殊的方法 return new ActionForward("转发名","/地址","true")
第一个转发名代表实例的名字,第二是路径,第三个代表是重定向(false为转发)

struts 关于视图
<html:link forward="search"><bean:message key="mainMenu.search"/></html:link>
这转向代表向控制方要求转向动作:在配置文件 里有   <forward   name="search"      path="/search.jsp"/> 直接转向的说明。
另外可以使用 <html:link page="/action/viewsignin"> 这个代表要连接到<action>中去进行解析。一般action中的配置如下
        <action
                  path="/viewsignin"
                  parameter="/page/view.jsp"
                  type="org.apache.struts.actions.ForwardAction"
                  scope="request"
                  name="loginForm"
                 validate="false"
                 input="/index.jsp">
        </action>

<message-resources>的使用
<message-reseources        key="images" parameter="imagesResources"/>
当调用时:<bean : message key="images.show " bundle="images"/>

struts 令牌 解决重复提交  :

首先:要在表单页的上一个控制页面,也就是说,如果想用表单提交时,要先利用sturts的转发机制,从一个action转到表单页,在这个转发action中,要定义一个“令牌” 很简单, saveToken(request);然后再由此ACTION转向到实际录入拥有FORM的页面,由此FORM页面再向下一个ACTION提交。(这时会在表单页自动生成一个hidden 保存了一个和时间相关的计算值)
其次 : 在表单提交后的action中,进行一个判断 if(isTokenValid(reqeust)) 如果表单提交的串值与session中的相符那就完成动作,同时session清空此串值(restToken(request);)。此时如果后退再提交,就出错,同时再次改写saveToken返回目的页,如录入或者主页面。

1 . <html:link page="/tokenaction.do?token=insertUser">用户注册</html:link>

2.<action path="/tokenaction" type="com.token.action.PreInsert" parameter="token">
<forward name="regUser" path="/reguser.jsp"></forward>
</action>

3. public class PreInsert extends DispatchAction {
public ActionForward insertUser(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
this.saveToken(request);
     return mapping.findForward("regUser");

}
}

4.<html:form action="/reguser">

5. <action attribute="regForm" input="/reguser.jsp" name="regForm"
path="/reguser" scope="request"
type="com.token.struts.action.RegAction" validate="false" >
<forward name="mutiSubmit" path="/reguser.jsp"></forward>
</action>

6. RegAction类excute方法内
 
ApplicationResources.properties  :error.mutiSubmit=<script>alert("you shouldn't submit form twice !");</script>

ActionMessages errors=new ActionMessages();
if(!this.isTokenValid(request)){
errors.add("mutiSubmit",new ActionMessage("error.mutiSubmit"));
this.saveErrors(request, errors);
return mapping.findForward("mutiSubmit");
}else{
this.resetToken(request);
……..
}

验证 (application.properties)


命令 native2ascii –encoding gbk f:\1.txt f:\2.txt
username=\u7528\u6237\u540d :
password=\u5bc6\u7801 :
name.error=<script>alert("\u7528\u6237\u540d\u4e0d\u80fd\u4e3a\u7a7a!");</script>
name.length=<script>alert("\u7528\u6237\u540d\u957f\u5ea6\u5fc5\u987b\u662f6-12\u4f4d!");</script>
pwd.error=<script>alert("\u5bc6\u7801\u4e0d\u80fd\u4e3a\u7a7a!");</script>

public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {

ActionErrors errors = new ActionErrors();
if(username==null||username.equals("")){
errors.add("user",new ActionMessage("name.error"));
return errors;
}
if(username.length()<6||username.length()>12){
errors.add("userlength", new ActionMessage("name.length"));
request.setAttribute("usercheck",username);
return errors;
}
if(password==null||password.equals("")){
errors.add("pass",new ActionMessage("pwd.error"));
return errors;
}
return errors;
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics