- 浏览: 27011 次
- 性别:
- 来自: 深圳
最新评论
关于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;
}
突出要求的是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;
}
发表评论
-
杂乱的东西
2008-06-15 20:18 942... -
使用jad及eclipse插件进行.class文件的反编译
2008-06-06 22:54 1637[/color][color=white][color=dar ... -
Criteria
2008-03-14 10:19 2208[color=white][color=gray][color ... -
软件工程 与 软件测试
2007-12-20 14:25 1219[color=white]1﹑软件产品的特性 产品特性: ⑴ ... -
hql 查询
2007-12-20 14:22 1187[color=white][color=black][colo ... -
分页`
2007-12-20 14:19 1863[color=black][color=white] 分页sq ... -
dwr util.js 应用
2007-12-20 14:18 241[color=white]regcheck.js------- ... -
sql 应用
2007-12-20 14:09 1094[/color][color=white][color=bla ... -
java 与 读取 .properties文件
2007-12-20 14:08 1414sqlcon.properties配置文件 连接数据库 dri ... -
整合小结
2007-12-20 14:04 3295spring 与 struts 整合 有3 种方法 实质是 ... -
双向 一对多
2007-12-20 13:59 1986hibernate双向 一对多映射 : 双向一对多关联 , ... -
浅入冬眠
2007-12-20 13:56 1103Hibernate Configuration 正如其名, ... -
对struts的认识
2007-12-20 13:37 1616struts 概述: model 部分 : ... -
浅谈mvc
2007-12-20 13:35 1310mvc 的核心思想 : 把程序分成相对独立,而又能协同工作 ...
相关推荐
而Struts1.x的令牌机制(Token)则是防止重复提交、跨页请求攻击的重要手段。在此,我们将深入探讨Struts1.x令牌的使用方法及其背后的原理。 首先,理解为何需要令牌。在Web应用中,用户可能会意外或恶意地多次点击...
如果令牌验证失败,服务器将拒绝处理请求,从而避免了恶意或重复的提交。 2. **Struts1.x的Token插件**: Struts1.x提供了一个内置的Token插件,用于支持Token机制。该插件会在ActionForm中生成一个唯一的Token,...
在实际应用中,Jcaptcha4Struts2还可以与其他安全措施结合,如CSRF令牌,进一步增强系统安全性。同时,由于其基于Struts2的特性,可以轻松与其他Struts2组件和拦截器配合,实现更复杂的业务逻辑。 总结来说,...
总的来说,Struts的令牌机制通过生成、传递、验证和销毁令牌,有效地防止了重复提交的问题,确保了Web应用的稳定性和数据的准确性。在实际开发中,理解并正确使用令牌机制对于防止恶意操作和提升用户体验至关重要。
在你提供的压缩包文件"token"中,可能包含了一个简单的Struts2令牌实例,你可以通过查看源代码学习如何在实际项目中集成和使用令牌机制。学习和理解这个实例,将有助于你更好地理解和应用Struts2的令牌功能。
Struts令牌技术是一种防止重复提交的安全机制,尤其在处理敏感数据时显得尤为重要。在Web应用中,用户可能会无意或有意地多次点击提交按钮,导致数据重复处理,这可能带来不必要的问题,例如重复购买商品或执行其他...
这里的`excludeMethods`属性设置为`default`意味着所有方法都不会被排除在外,即所有的表单提交都需要经过令牌验证。 #### 三、Struts2令牌的应用场景 ##### 1. 防止重复提交 在Web应用中,用户可能由于网络延迟等...
4. **验证令牌**:当用户提交表单时,Struts2的拦截器会自动检测令牌。如果令牌有效,请求会被处理;如果令牌已经被使用或不存在,将会抛出异常,如`TokenException`。 5. **处理异常**:在Action中捕获`...
通过以上步骤,我们就可以在Struts2应用中实现有效的令牌验证,保护用户免受CSRF攻击并防止重复提交。这个压缩包文件"token"很可能包含了完成以上步骤所需的示例代码,包括struts.xml配置文件、Action类、JSP页面等...
Struts2是一个流行的Java web框架,它...总的来说,Struts2的令牌机制是通过生成和验证令牌来防止重复提交和CSRF攻击的有效方式。开发者应当理解其工作原理,并在需要的地方正确使用,以提高应用程序的安全性和稳定性。
通过在表单中添加`<s:token/>`标签,可以生成一个唯一的令牌,并在服务器端验证该令牌的有效性。如果令牌无效,可以通过配置`struts.xml`中的`<result>`元素重定向到特定的错误页面。 ### Struts2与Servlet API集成...
二、Struts令牌的实现步骤 1. 添加Struts令牌拦截器 在Struts的配置文件(通常为struts.xml)中,需要添加`token`和`tokenSession`拦截器到默认的拦截器栈。`token`拦截器负责在表单请求时生成和验证令牌,`token...
#### 一、Struts令牌机制简介 Struts框架通过生成一个唯一的令牌(Token),并在每次用户提交表单时验证该令牌的有效性,以此来防止重复提交。这种机制可以确保即使用户多次点击提交按钮或者浏览器回退后重新提交...
为了防止这种情况,Struts2引入了令牌机制,强制服务器验证每个POST请求的有效性。 令牌的工作流程如下: 1. 用户访问表单页面时,服务器生成一个唯一的令牌,并将其存储在用户的会话中。 2. 服务器将这个令牌作为...
6. `org.apache.struts2.util`:提供了一些实用工具类,如TokenHelper用于处理令牌,防止重复提交,还有FreemarkerManager用于管理FreeMarker模板引擎。 7. `org.apache.struts2.components`:包含各种UI组件,如...
### 使用Struts的同步令牌避免表单重复提交 #### 一、使用方法 为了有效地防止Web应用程序中的表单重复提交问题,Struts框架提供了一种简单而强大的解决方案——同步令牌模式(Synchronization Token Pattern, STP...
这里的`<interceptor-ref name="token">`指定了使用令牌拦截器,`<param name="sessionStatus">invalid.token</param>`设置了当令牌验证失败时的会话状态,以便在Action中检查并作出相应处理。 在Action类中,可以...
1. **认证(Authentication)**: 这是验证用户身份的过程,Spring Security提供了多种认证方式,如基于用户名和密码的登录、LDAP验证、JWT令牌等。在这个案例中,`spring-security-core-3.0.2.RELEASE.jar`包含核心...