遇到问题: 测试人员用burpsuite工具抓取表单数据,当页面点击提交数据后,工具burpsuite将截取到的数据修改后模拟发送,依然可以正常修改,解决办法 项目添加token验证,
第一步:先写token生成和销毁方法
package com.smartt.api.interceptor; import java.lang.annotation.*; @Target(ElementType.METHOD) @Retention (RetentionPolicy.RUNTIME) @Documented public @interface Token { boolean save() default false; boolean remove() default false; }
TokenInterceptor.java
package com.smartt.api.interceptor; 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; 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) { boolean needSaveSession = annotation.save(); if (needSaveSession) { request.getSession(false).setAttribute("token", UUID.randomUUID().toString()); } boolean needRemoveSession = annotation.remove(); if (needRemoveSession) { if (isRepeatSubmit(request)) { 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; } }
第二步:写springboot的拦截器,拦截对应的访问方法地址,进行token验证
package com.smartt.api; import org.springframework.boot.SpringApplication; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import com.smartt.api.interceptor.TokenInterceptor; @Configuration @ComponentScan(useDefaultFilters = true) public class WebAppConfig extends WebMvcConfigurerAdapter { public static void main(String[] args) { SpringApplication.run(WebAppConfig.class, args); } /** * 配置拦截器 * @author lance * @param registry */ public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new TokenInterceptor()).addPathPatterns("/admin/**"); } }
我写的是 /admin/ 对应的controller访问路径的,如果多个不同的访问地址可以这么写 /** 或
如果写了多个又不想全部都拦截可以这么写
多个拦截器组成一个拦截器链 // addPathPatterns 用于添加拦截规则 // excludePathPatterns 用户排除拦截 registry.addInterceptor(new MyInterceptor1()).addPathPatterns("/xxx1/**"); registry.addInterceptor(new MyInterceptor2()).addPathPatterns("/xxx2/**");
- 接下来就是关键,在进入到你需要提交的页面的controller方法上使用你的自定义注解
- 在提交数据的controller方法上删除
- 最后一个步骤,首先需要再页面获取到session中的token并放入隐藏域中,最后如果你是ajax提交的数据,记得一定要把token当做参数提交上去,否则后台无法获取到你页面提交的token值,就无法和session中的作比较
相关推荐
基于SSM开发框架,使用Token并通过注解和拦截器方式实现表单重复提交验证
防止表单重复提交的方法(简单的token方式),内附实现代码及实现思路。
struts2防止表单重复提交,利用struts的拦截器tokenSession,轻轻松松解决表单重复提交的问题。 附件为源代码,后台延迟了3秒,可直接在web服务器下部署运行,输入用户名和密码后,多点几次提交按钮,然后看控制台...
本文实例讲述了PHP使用token防止表单重复提交的方法。分享给大家供大家参考,具体如下: <?php /* * PHP使用token防止表单重复提交 * 此处理方法纯粹是为了给初学者参考 */ session_start(); function set_token...
vue前端后端分离spring boot 2.0集成websocket,带身份认证实现消息推送功能
1. Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是AOP的一种实现. 2. 拦截器栈(Interceptor Stack)。Struts2拦截器栈就是将拦截器按...
主要介绍了Spring Cloud Feign统一设置验证token实现方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
本篇文章主要介绍了springMVC中基于token防止表单重复提交方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
JavaEE Struts2利用tokenSession防止重复提交
自定义封装注解类,(生成token存放到redis中)通过注解的方式解决API接口幂等设计防止表单重复提交
主要介绍了PHP实现防止表单重复提交功能,结合实例形式分析了php基于token验证防止表单重复提交的相关操作技巧,非常简单实用,需要的朋友可以参考下
主要讲解了在structs怎样通过Token令牌解决表单重复提交的问题。附带了擦参考项目。
token-springMVC 防止重复提交
本案例中 使用maven 搭建spring boot 基本案例 其中实现了 用户登录功能,实现Filter 和 拦截器两种方式 来过滤session登录,后续会使用token方式,请大家关注
struts token机制解决表单重复提交
利用Token机制解决重复重复提交
NULL 博文链接:https://minejava.iteye.com/blog/960617
C#WEB用户令牌TOKEN验证,防止HTTP、GET、POST等提交包含服务端和客户端源码。Nginx集群,SSL证书的WebApi令牌验证
简单的新手实用demo