`
郑云飞
  • 浏览: 817137 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

spring boot项目添加拦截器验证token防止表单重复提交

 
阅读更多

遇到问题: 测试人员用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/**");

 

  1. 接下来就是关键,在进入到你需要提交的页面的controller方法上使用你的自定义注解
  2. 在提交数据的controller方法上删除
  3. 最后一个步骤,首先需要再页面获取到session中的token并放入隐藏域中,最后如果你是ajax提交的数据,记得一定要把token当做参数提交上去,否则后台无法获取到你页面提交的token值,就无法和session中的作比较
分享到:
评论

相关推荐

    利用struts的token控制重复提交

    1. **配置Action**: 在Struts配置文件(如struts.xml)中,为需要防止重复提交的Action添加`token`拦截器。 ```xml <interceptor-ref name="token"/> <result name="success">/success.jsp ...

    spring boot security学习练习demo源码

    在表单提交时,系统会检查请求中是否包含有效的CSRF令牌。 8. **异常处理**:Spring Security处理未授权和未认证的异常,你可以自定义错误页面或者全局异常处理器来优雅地展示错误信息。 9. **JWT支持**:尽管在...

    SpringBoot拦截器实现登录拦截的方法示例

    可以考虑在拦截器中加入对CSRF令牌的验证,确保表单提交的安全。对于XSS攻击,则需要在Web配置中设置合适的HttpMessageConverter来解决乱码问题。 上述知识点提供了一个基本的SpringBoot拦截器实现登录拦截的方法...

    史上最全springboot+vue3+element-plus代码实现web登录页面(附件有代码)

    SpringBoot_demo是一个包含Spring Boot、Vue.js和Element Plus框架实现的Web登录页面示例项目。这个项目展示了如何将这三个技术栈结合,构建一个完整的前端到后端的应用。下面将详细介绍这些关键技术及其在登录页面...

    SpringSecurity

    4. **CSRF防护**:为了防止跨站请求伪造(Cross-Site Request Forgery, CSRF)攻击,SpringSecurity提供了内置的CSRF保护机制,可以通过在表单提交中添加隐藏令牌来确保请求的合法性。 5. **安全过滤器链**:Spring...

    SpringbootUsingSecurity:基于Spring Boot的Spring Security

    - 使用`JwtTokenFilter`拦截器处理JWT的验证和授权。 7. **自定义登录表单** - 可以通过定义`@Controller`和HTML模板来自定义登录界面。 - 提交登录信息到Spring Security的默认登录处理端点。 8. **异常处理**...

    Springboot+SpringSecurity+JWT实现用户登录和权限认证示例

    1. **项目初始化**:创建一个新的Spring Boot项目,添加`spring-boot-starter-web`、`spring-boot-starter-security`、`spring-security-oauth2`和`spring-security-jwt`依赖。 2. **用户实体类与数据访问层**:...

    基于SpringBoot的权限管理系统

    - 定义登录页面,表单提交的URL映射到Spring Security的默认登录处理端点`/login`。 **4. 权限授权** - 使用`@PreAuthorize`、`@PostAuthorize`、`@Secured`等注解进行方法级别的权限控制。 - 配置权限角色,如`@...

    SpringBoot整合Spring Security.docx

    Spring Security 是一个强大的身份验证和访问控制框架,适用于构建安全的 Java 应用程序,尤其在Spring Boot中,集成Spring Security能简化安全配置,提供一套完整的安全解决方案。它包括认证和授权两个主要方面,...

    securityDemo

    【Spring Security简介】 Spring Security是Spring生态系统的组件之一,它为Java应用提供了全面的...在实际项目中,还可以根据需求进一步扩展,例如集成OAuth2、JWT token、自定义过滤器等,以满足复杂的安全场景。

    spring-security

    1. **XML配置**:在传统的Spring项目中,我们通常通过XML配置来设置Spring Security,包括定义安全拦截规则、配置认证和授权策略等。 2. **Java配置**:随着Spring Boot的发展,现在更推荐使用Java配置,它更加直观...

    spring mvc login demo

    - `springmvc-servlet.xml`:配置Spring MVC的相关组件,如视图解析器、拦截器等。 - `applicationContext.xml`:配置Spring的核心组件,如Bean的定义和数据源。 ### 9. 测试与调试 使用Postman或类似工具模拟POST...

    spring security demo

    项目可能包括了定制的登录表单和控制器方法,以及配置相应的过滤器来处理登录请求。 6. **CSRF防护**:为了防止跨站请求伪造攻击,Spring Security默认开启了CSRF保护。项目中应有相关配置,并可能包含CSRF token的...

    SpringBoot_SpringSecurity:前后端分离登陆拦截设计

    在SpringBoot项目中,我们可以通过添加相应的Maven或Gradle依赖来引入SpringSecurity模块,这样就可以快速地开始进行安全控制。 SpringSecurity提供了认证(Authentication)和授权(Authorization)功能,可以实现...

    spring-security-3.2.4.RELEASE-dist.zip

    4. **CSRF防护**:Spring Security 3.2.4包含了对跨站请求伪造(CSRF)的防护,通过添加CSRF token到表单和检查请求中的token来防止这类攻击。 5. **记住我功能**:Spring Security允许实现“记住我”功能,让用户...

    动力节点Spring Security配套代码

    - **拦截器**:自定义的拦截器可以用于实现特定的业务逻辑,例如记录登录日志或会话超时处理。 - **用户详情服务**:如`UserDetailsService`,用于获取用户信息,通常与数据存储(如数据库)集成。 - **过滤器**:如...

    springboot+mybatis-plus+jquery+filter+ajax 实现登录功能

    在登录功能中,jQuery 可用于前端处理用户输入,监听表单提交事件,并使用 Ajax 进行异步数据通信,这样可以实现无刷新的登录体验。 4. **Ajax**: Ajax(Asynchronous JavaScript and XML)是一种在无需重新加载...

    security_certification.rar

    - Spring Security拦截请求,验证提交的凭证。 - 如果凭证有效,Spring Security创建一个Authentication对象,包含用户信息,并将其放入SecurityContextHolder。 - 之后,每次用户请求受保护的资源,Spring ...

    fishsso:基于spring boot 独立开发的一套统一认证解决方案,易读、易拓展

    当前版本支持from表单提交拦截和ajax请求拦截 校验规则为从前端请求头中获取accesstoken,校验其有效性 核心类说明: SecurityInterceptor(拦截器实现) SecurityMemoryConstant(启动加载ip白名单、路由白名单) ...

    spring security两篇文档

    9. **集成其他Spring组件**:Spring Security可以很好地与Spring MVC、Spring Boot、Spring Data等Spring生态系统中的其他组件集成,提供一站式安全解决方案。 10. **自定义扩展**:Spring Security的灵活性允许...

Global site tag (gtag.js) - Google Analytics