之前struts2解决token必须在每个action配置里面重新定义token的拦截器,如果配置较多无疑非常麻烦,于是就写了个基于Annotation的TokenInterceptor,只要在需要避免重复提交的action方法前使用@Token注解,拦截器能自动拦截方法并做Token的检验。
使用时除了把在action配置中重定义拦截器,改为注解,其他与原来的拦截器完全一致,包括注意你必须在调用action的token方法前使用<s:token/>获得自己的令牌。
1、token主要用来防止重复提交(就是你提交好以后,点后退,再点提交),把TokenInterceptor部署到struts2的拦截器栈里:
<interceptors>
<interceptor name="token" class="com.cgs.util.interceptor.TokenInterceptor"/> <==
<!--这个也可以不要 此为绑定拦截器
<interceptor-stack name="normalStack">
<interceptor-ref name="token"/>
<interceptor-ref name="paramsPrepareParamsStack"/> <interceptor-ref name="defaultStack"></interceptor-ref> warning:如果不要defaultStack,所有带有传递参数的均无法正常使用了,在Action中所有的参数无法被注入。struts-default中,默认的拦截器引用是defaultstack,这个拦截器包传说是经过精心设计的。。所以会把所有的参数注入! 因此要更改默认拦截器,需要加上这个defaultstack
</interceptor-stack>-->
</interceptors> <!--<default-interceptor-ref name="normalStack" />-->
特别注意红色两行的顺序!先自定义再Default
<package name="forum" namespace="/forum" extends="struts-shop">
<action name="bbs_*" class="com.cgs.forum.action.ForumAction" method="{1}"> <result name="...">...</result>
....
<result name="...">...</result>
<!-- token Action防止刷新 配置错误返回页面-->
<interceptor-ref name="token" /> <==
<result name="invalid.token">错误页面</result> <==
</action>
</package>
2、再把自定义的拦截器部署为默认拦截器://这一步不用
<default-interceptor-ref name="normalStack"/>
3、在Action类中定义@Token注解:
class CURDAction {
...
@Token <==
public void save(){...}
}
4、在提交过来的页面里面放入<s:token/>的标记:
<s:form action="user/save.action">
<s:token></s:token> <==
<input type="hidden" name="id" value="${id }"/>
<s:textfield name="username" label="username"/>
<s:textfield name="password" label="password"/>
<s:submit/>
</s:form>
以后该页面提交以后就不能通过后退在进行重新提交了。
下面是此注解用到的两个JAVA文件
1.创建@Token
Token.java <==
===========
package com.cgs.util.annotations;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.*;@Target(METHOD)
@Retention(RUNTIME)
public @interface Token {}
2.拦截器方法
TokenInterceptor.java <==
=========
package com.cgs.util.interceptor;
import java.lang.reflect.Method;
import com.cgs.util.annotations.Token;
import com.opensymphony.xwork2.ActionInvocation;public class TokenInterceptor extends org.apache.struts2.interceptor.TokenInterceptor {
private static final long serialVersionUID = 1L;
@Override
protected String doIntercept(ActionInvocation invocation) throws Exception {
Object action = invocation.getAction();
if(action != null) {
Method method = getActionMethod(action.getClass(), invocation.getProxy().getMethod());
Token token = method.getAnnotation(Token.class);
if(token != null) {
return super.doIntercept(invocation);
}
}
return invocation.invoke();
} public static final Method getActionMethod(Class<? extends Object> actionClass, String methodName) throws NoSuchMethodException {
Method method;
try {
method = actionClass.getMethod(methodName, new Class[0]);
} catch (NoSuchMethodException e) {
String altMethodName = "do" + methodName.substring(0, 1).toUpperCase() + methodName.substring(1);
method = actionClass.getMethod(altMethodName, new Class[0]);
e.printStackTrace();
}
return method;
}
}
struts2 注解方式使用token拦截器
@InterceptorRefs({ @InterceptorRef(value="token",params={"includeMethods","login1"}), @InterceptorRef("crudStack") })
相关推荐
1. Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是AOP的一种实现. 2. 拦截器栈(Interceptor Stack)。Struts2拦截器栈就是将拦截器按...
Struts2拦截器会检查这个令牌,确保它与服务器会话中的令牌匹配。 3. **令牌验证**:如果令牌匹配,那么表单数据会被正常处理;如果不匹配或者令牌不存在,那么表单提交将被拒绝,以此来防止重复提交或非法请求。 ...
### Struts2内置拦截器简介 Struts2框架在实现MVC模式时,为了更好地管理请求处理过程中的各个阶段,引入了拦截器机制。通过拦截器可以对请求进行预处理或后处理,使得代码更加模块化和易于维护。Struts2提供了一...
1. **启用Token插件**:在Struts2的配置文件`struts.xml`中,需要启用Token拦截器栈,如下所示: ```xml <package name="default" extends="struts-default"> <interceptor-ref name="token"> <!-- 是否将...
Struts2默认提供了一些拦截器来帮助处理这个问题,但如题目所述,由于性能考虑,项目组决定不使用Struts2的标签,因此需要自定义拦截器来实现防止重复提交的功能。 自定义拦截器的实现主要分为以下几个步骤: 1. *...
4. **验证与处理**:当表单提交后,Struts2的tokenSession拦截器会自动进行token的验证。如果验证通过,业务逻辑正常执行;若失败,则会抛出异常,提示用户重新操作。 在实际应用中,我们还需要考虑一些其他情况,...
3. 使用Token拦截器: 在Action类中,需要使用`@Token`注解来标记需要进行Token验证的方法。例如: ```java public class MyAction extends ActionSupport { @Token(save = true) public String execute() { // ...
拦截器(Interceptor)是Struts2的核心特性之一,它基于AOP(面向切面编程)思想,提供了对请求处理过程的灵活控制。在本篇文章中,我们将深入探讨Struts2的拦截器机制以及AOP的概念。 **AOP(面向切面编程)**是一...
- **说明**:与Token拦截器类似,但使用`HttpSession`存储令牌,适用于需要长时间保持有效性的场景。 25. **Validation (验证)** - **功能**:用于验证Action中的数据,支持自定义验证规则,并可以通过XML文件...
1. **配置Struts2的Token拦截器:** 在struts.xml配置文件中,需要将`token`拦截器加入到默认或者特定的Action配置中。例如: ```xml <interceptor name="token" class="org.apache.struts2.interceptor....
3. **验证Token:** 在处理表单提交的Action方法中,Struts2的Token拦截器会自动进行Token验证。如果验证失败(比如因为用户刷新页面),拦截器会抛出一个`TokenException`,你可以捕获这个异常并处理。 ```java ...
在Java Web应用开发中,Struts2框架提供了一种非常实用的方法来解决这个问题——通过使用`tokenSession`拦截器。相比于传统的`token`拦截器,`tokenSession`提供了更加灵活和友好的用户体验。本文将深入探讨`token...
### Struts2拦截器详解 #### 一、拦截器的概念与意义 拦截器(Interceptor)在Struts2框架中扮演着至关重要的角色。它的工作原理类似于过滤器(Filter),能够拦截用户请求,并对其进行预处理或者后处理。拦截器...
拦截器是Struts2框架中的一个重要组成部分,它们在Action调用前后执行,可以用于实现各种功能,如日志、事务管理以及我们的重点——权限拦截。 权限拦截是Web应用安全机制的重要一环,它确保只有具备特定权限的用户...
首先,我们需要在Struts2的配置文件(struts.xml)中添加Token拦截器。这个拦截器会处理Token的生成和验证过程。例如: ```xml <interceptor name="token" class="org.apache.struts2.interceptor....
在Struts的配置文件中定义一个Token拦截器,拦截所有需要防止重复提交的Action,然后在拦截器中实现Token的验证逻辑。 通过这种方式,Struts+Token机制可以有效地防止由于用户误操作或者网络延迟造成的表单重复提交...
在这个"struts2实现的简单登陆 附加拦截器防止重复提交"的项目中,我们将深入探讨Struts2如何处理用户登录以及如何通过拦截器来防止重复提交的问题。 首先,我们来理解一下Struts2的核心概念。Struts2框架基于...
Token 拦截器是 Struts2 提供的一个特殊的拦截器,用于防止重复提交。 Token 机制 Token 机制是 Struts2 的一个安全机制,用于防止重复提交。Token 是一个唯一的标识符,用于标识一个请求。在提交表单时,Struts2 ...
在Struts2中,拦截器扮演着至关重要的角色,它们是实现业务逻辑和控制流程的核心组件。本教程将深入探讨如何使用Struts2拦截器来实现用户权限登录功能。 首先,了解拦截器的概念。拦截器是AOP(面向切面编程)的一...
在实际开发中,Struts提供了`org.apache.struts2.interceptor.TokenInterceptor`拦截器来自动化这个过程。只需要在Struts配置文件中启用这个拦截器,并指定对应的错误页面,就可以自动处理重复提交的问题。 例如,...