package test.demo.token;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention (RetentionPolicy.RUNTIME)
public @interface Token {
//自定义标签类
boolean create() default false ;
boolean validate() default false ;
boolean reply() default false ;
}
package test.demo.token;
import java.lang.reflect.Method;
import java.util.UUID;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import com.util.MethodUtil;
//拦截器类
public class TokenInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle( HttpServletRequest request, HttpServletResponse response, Object handler ) throws Exception {
if (handler instanceof HandlerMethod) {
HandlerMethod handlerMethod = (HandlerMethod) handler;
Method method = handlerMethod.getMethod();
Token annotation = method.getAnnotation(Token.class);
if (annotation != null) {
if (annotation.create()) {
request.getSession(false).setAttribute("token", UUID.randomUUID().toString() );
}
if (annotation.validate()) {
if (isRepeatSubmit(request)) {
if(annotation.reply()) writeMessageUtf8(response);
return false;
}
request.getSession(false).removeAttribute("token");
}
}
return true;
} else{
return super.preHandle(request, response, handler);
}
}
private boolean isRepeatSubmit(HttpServletRequest request) {
String serverToken = (String) request.getSession(false).getAttribute("token");
if (serverToken == null) return true;
String clinetToken = request.getParameter("token");
if (clinetToken == null) return true;
if (!serverToken.equals(clinetToken)) return true;
return false;
}
private void writeMessageUtf8(HttpServletResponse response) throws Exception {
try {
response.setCharacterEncoding("UTF-8");
response.getWriter().print(MethodUtil.toJson("REPEAT"));
} finally {
response.getWriter().close();
}
}
}
页面form里加:
<input type="hidden" name="token" value="${token}" />
@Token(create=true)//mvc里,进入页面前的方法上面加此
@Token(validate=true)//mvc里提交方法上面加此
spring 配置文件里加:
<mvc:interceptors>
<!-- 配置Token拦截器,防止用户重复提交数据 -->
<mvc:interceptor >
<mvc:mapping path = "/com/xxx/**" />
<bean class = "test.demo.token.TokenInterceptor" />
</mvc:interceptor >
</mvc:interceptors>
分享到:
相关推荐
在Spring MVC框架中,防重复提交是一个常见的需求,特别是...这个过程涉及客户端和服务器端的交互,以及可能的拦截器、自定义标签库、AOP等技术的应用。正确实施防重复提交策略,可以显著提高系统的稳定性和用户体验。
此拦截器用于防止重复提交表单。它会生成一个唯一的令牌并在每次提交时验证这个令牌是否有效。 ##### 2.18 Timer 此拦截器可以记录Action执行的时间,并将时间信息输出到日志或页面上。 ##### 2.19 Validation 此...
| Token | 通过Token防止重复提交 | | Validation | 使用定义的规则验证提交的数据 | | Workflow | 调用Action的validate方法,如果验证失败则返回输入视图 | #### 四、拦截器的作用与优势 拦截器在软件开发中...
21. `token` 和 `token-session` 拦截器:防止重复提交,通过检查Action中的token,确保每个请求的唯一性。 22. `validation` 拦截器:执行在`xxxAction-validation.xml`中定义的验证规则,进行数据校验。 23. `...
1. **配置Action**: 在Struts配置文件(如struts.xml)中,为需要防止重复提交的Action添加`token`拦截器。 ```xml <result name="success">/success.jsp <result name="input">/input.jsp ``` 2. **创建...
防止表单重复提交是Web开发中的一个重要功能,为了避免重复提交造成的数据重复或错误,Struts2同样提供拦截器实现这一功能。可以配置token拦截器来为每个请求生成一个令牌(token),并将这个令牌存储在客户端。提交...
拦截器是Spring MVC中一个重要的组件,它允许在请求被控制器处理之前或之后执行自定义逻辑。通过配置拦截器,可以实现如登录检查、权限验证等功能。在MyEclipse中,学生需要创建自定义拦截器类,并在Spring的配置...
15.3 使用令牌防止表单重复提交 313 15.3.1 使用s:token/表单标签 313 15.3.2 令牌拦截器规则的例外 314 15.4 自动显示等待页面 316 15.5 完成CRUD操作的一个动作 317 15.5.1 CRUD 317 15.5.2 拦截器和接口 318 ...
本篇将详细阐述Struts1中涉及的几个核心知识点:标签库、文件上传与下载以及防止重复提交。 1. **Struts1标签库** Struts1提供了一套丰富的自定义JSP标签,使得开发者能够更加方便地在视图层操作数据。例如,`...
- **token防止表单重复提交拦截器**:防止用户重复提交表单。 - **自定义拦截器**:可以通过实现Interceptor接口来创建自定义拦截器。 #### 六、Hibernate基础 ##### 1. 持久化、持久层 - **持久化**:将内存中的...
根据提供的文件信息,我们可以归纳出以下关键知识点,主要聚焦于Struts2框架的...随着实践经验的积累,开发者还可以探索更多高级特性,如类型转换、文件上传下载、防止重复提交等功能,进一步提高Web应用的质量和性能。
在本项目中,自定义的拦截器会在每个请求到达控制器之前检查请求头中的JWT,确保请求的合法性。如果JWT有效,请求将继续处理;否则,会返回错误信息。 4. **资源存储与权限管理**:JWT中可以携带用户的资源权限信息...
Spring MVC中的拦截器可以用来实现日志记录、性能监控等功能。 25. **Spring MVC中的Controller如何工作** - 控制器是处理用户请求的主要组件。它接收请求,调用相应的业务逻辑,并返回一个`ModelAndView`对象。 ...
Struts2的拦截器用于在请求处理前后执行某些操作,可以自定义拦截器来扩展Struts2的功能。 ##### 9.9 文件上传 Struts2提供了文件上传的支持,可以通过`File`类型的字段来接收上传的文件。 ##### 9.10 防止表单...
24. **防止重复提交**:可以使用s:token标签防止表单重复提交的问题。 25. **Struts2整合Spring和Hibernate**:Struts2与Spring的整合可以实现依赖注入,与Hibernate的整合则方便进行持久化操作。 以上就是Struts2...
### Struts + Spring + Hibernate 资料 ...- **高度可定制性**:支持自定义标签库、拦截器等,能够满足复杂的应用需求。 - **社区支持**:拥有庞大的开发者社区,丰富的文档和示例,方便解决问题。
常用于处理表单提交后的跳转,避免重复提交。 5. **响应JSON数据**: - **过滤静态资源**:SpringMVC的DispatcherServlet默认会拦截所有请求,包括静态资源(如图片、CSS、JavaScript)。为防止这种情况,可以在`...
20. **Struts2防止重复提交**: - 使用Token拦截器或TokenSession拦截器。 - 在表单中加入Token标签,并在配置文件中配置拦截器。 以上只是部分面试题的关键知识点,每个主题都值得深入学习和理解。在实际面试中...
这涉及到用户身份验证和授权,可能使用了Spring Security或自定义的认证机制。 2. **投票创建**:管理员或特定权限的用户可以创建投票主题,设置选项和投票截止日期。这部分可能使用Struts2的表单提交和Action处理...
- 对于高级特性,如拦截器(Interceptors)、动态方法调用(Dynamic Method Invocation)等,Struts2也提供了丰富的支持。 综上所述,Struts2是一个功能强大且高度可定制的Java Web框架,适用于构建复杂的Web应用...