Springboot 如何实现filter拦截token验证和跨域

针对您的问题,我来为您详细讲解Spring Boot如何实现filter拦截token验证和跨域。

一、使用Filter拦截Token验证

1. 引入相关依赖

在pom.xml文件中引入以下相关依赖:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>

    <dependency>
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt</artifactId>
        <version>0.9.1</version>
    </dependency>
</dependencies>

2. 编写TokenFilter

在项目中新建TokenFilter.java文件,继承OncePerRequestFilter类,并重写doFilterInternal方法。在该方法中,我们可以对请求头中的Token进行验证。

import com.fasterxml.jackson.databind.ObjectMapper;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.filter.OncePerRequestFilter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@Component
public class TokenFilter extends OncePerRequestFilter {

    @Value("${jwt.secret}")
    private String secret;

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        String token = request.getHeader("Authorization");
        if(StringUtils.isEmpty(token) || !token.startsWith("Bearer ")){
            filterChain.doFilter(request, response);
            return;
        }

        try {
            Claims claims = Jwts.parser()
                        .setSigningKey(secret)
                        .parseClaimsJws(token.replace("Bearer ", ""))
                        .getBody();
            request.setAttribute("claims", claims);
        } catch (SignatureException e) {
              response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Invalid Token!");
              return;
        }
        filterChain.doFilter(request, response);
    }
}

3. 配置TokenFilter

在Spring Boot中使用@WebFilter注解进行配置。在项目启动时,会自动加载该Filter进行处理。

import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.filter.RequestContextFilter;

@Configuration
public class FilterConfig {

    @Bean
    public FilterRegistrationBean tokenFilter(){
        FilterRegistrationBean<TokenFilter> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(new TokenFilter());
        registrationBean.addUrlPatterns("/*");
        registrationBean.setName("TokenFilter");
        registrationBean.setOrder(Ordered.HIGHEST_PRECEDENCE);
        return registrationBean;
    }
}

至此,我们就已经完成了使用Filter拦截Token验证的过程。

二、使用Filter实现跨域请求

1. 编写CorsFilter

在项目中新建CorsFilter.java文件,继承OncePerRequestFilter类,并重写doFilterInternal方法。在该方法中,我们可以设置response的header,实现跨域请求。

import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@Component
public class CorsFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "*");
        response.setHeader("Access-Control-Allow-Headers", "Content-Type,Access-Token");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Credentials", "true");
        response.setHeader("Access-Control-Expose-Headers", "*");
        if("OPTIONS".equalsIgnoreCase(request.getMethod())){
            response.setStatus(HttpServletResponse.SC_OK);
            return;
        }
        filterChain.doFilter(request, response);
    }
}

2. 配置CorsFilter

同样地,在Spring Boot中使用@WebFilter注解进行配置。在项目启动时,会自动加载该Filter进行处理。

import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;

@Configuration
public class FilterConfig {

    @Bean
    public FilterRegistrationBean corsFilter(){
        FilterRegistrationBean<CorsFilter> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(new CorsFilter());
        registrationBean.addUrlPatterns("/*");
        registrationBean.setName("CorsFilter");
        registrationBean.setOrder(Ordered.HIGHEST_PRECEDENCE);
        return registrationBean;
    }
}

至此,我们就已经完成了使用Filter实现跨域请求的过程。

三、完整的配置文件

最后,如果您需要参考完整的配置文件,可以使用以下代码块进行配置。该配置文件中包含上述两种Filter的配置。

import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.util.StringUtils;
import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.filter.RequestContextFilter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@Configuration
public class FilterConfig {

    @Value("${jwt.secret}")
    private String secret;

    @Bean
    public FilterRegistrationBean tokenFilter(){
        FilterRegistrationBean<TokenFilter> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(new TokenFilter());
        registrationBean.addUrlPatterns("/*");
        registrationBean.setName("TokenFilter");
        registrationBean.setOrder(Ordered.HIGHEST_PRECEDENCE);
        return registrationBean;
    }

    @Bean
    public FilterRegistrationBean corsFilter(){
        FilterRegistrationBean<CorsFilter> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(new CorsFilter());
        registrationBean.addUrlPatterns("/*");
        registrationBean.setName("CorsFilter");
        registrationBean.setOrder(Ordered.HIGHEST_PRECEDENCE);
        return registrationBean;
    }

    private class TokenFilter extends OncePerRequestFilter {

        @Override
        protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
            String token = request.getHeader("Authorization");
            if(StringUtils.isEmpty(token) || !token.startsWith("Bearer ")){
                filterChain.doFilter(request, response);
                return;
            }

            try {
                Claims claims = Jwts.parser()
                        .setSigningKey(secret)
                        .parseClaimsJws(token.replace("Bearer ", ""))
                        .getBody();
                request.setAttribute("claims", claims);
            } catch (SignatureException e) {
                response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Invalid Token!");
                return;
            }
            filterChain.doFilter(request, response);
        }
    }

    private class CorsFilter extends OncePerRequestFilter {

        @Override
        protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
            response.setHeader("Access-Control-Allow-Origin", "*");
            response.setHeader("Access-Control-Allow-Methods", "*");
            response.setHeader("Access-Control-Allow-Headers", "Content-Type,Access-Token");
            response.setHeader("Access-Control-Max-Age", "3600");
            response.setHeader("Access-Control-Allow-Credentials", "true");
            response.setHeader("Access-Control-Expose-Headers", "*");
            if("OPTIONS".equalsIgnoreCase(request.getMethod())){
                response.setStatus(HttpServletResponse.SC_OK);
                return;
            }
            filterChain.doFilter(request, response);
        }
    }
}

至此,希望我这份攻略可以帮到您。如果还有任何问题,欢迎继续提问。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Springboot 如何实现filter拦截token验证和跨域 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • springmvc整合ssm配置的详细代码

    下面我将为您详细讲解如何在Spring MVC框架下整合SSM(Spring + SpringMVC + MyBatis)框架,并提供两个示例说明。 步骤一:创建Maven项目 首先,您需要创建一个Maven项目,以便引入所需的库和依赖项。创建完成后,在pom.xml中添加以下依赖: <dependencies> <!– Spring M…

    Java 2023年6月15日
    00
  • 学习SpringBoot容器功能及注解原理

    学习SpringBoot容器功能及注解原理的攻略可以分为以下几个步骤: 步骤一:了解Spring容器的概念和作用 Spring容器是一个IoC(控制反转)容器,它负责创建和管理bean对象的生命周期,将不同的组件进行装配或自动装配成为一个整体,使得开发人员可以更好地进行系统集成,提高代码的可维护性和可扩展性。 步骤二:学习SpringBoot的容器功能 Sp…

    Java 2023年5月31日
    00
  • Java Cookie与Session实现会话跟踪详解

    Java Cookie与Session实现会话跟踪详解 本文将详细介绍Java中Cookie与Session的使用方法,以及它们实现会话跟踪的原理。 会话跟踪简介 在Web应用程序中,会话跟踪是指识别与跟踪用户状态的过程,主要是为了维护用户与应用程序之间的交互状态。常见的应用场景包括登录、购物车、用户偏好设置等等。 会话跟踪通常是通过Cookie或Sessi…

    Java 2023年5月20日
    00
  • 10种简单的Java性能优化

    10种简单的Java性能优化完整攻略 Java程序的性能优化是非常重要的,可以提高程序运行效率,改善用户体验。下面是10种简单的Java性能优化策略: 1. 使用局部变量代替成员变量 使用局部变量可以避免每次访问成员变量时都要访问内存中的数据,因为局部变量存放在栈中,访问速度更快。对于循环中需要多次访问的变量,使用局部变量可以提高程序的运行速度。 示例: p…

    Java 2023年5月30日
    00
  • 总结Java常用排序算法

    总结Java常用排序算法 算法简介 排序算法是计算机程序设计中最基本的问题之一,它的目的是将一组“无序”的数据,按照某种规律进行排列。在Java中,常用的排序算法有如下几种: 冒泡排序 选择排序 插入排序 希尔排序 归并排序 快速排序 堆排序 冒泡排序 冒泡排序是一种简单的排序算法。它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就将它们交换过…

    Java 2023年5月19日
    00
  • 微信小程序下拉刷新界面的实现

    以下是关于微信小程序下拉刷新界面实现的完整攻略,包括两条实例说明。 一、基本概念 在介绍如何实现下拉刷新之前,需要了解一些基本概念: scroll-view组件:滚动视图,用于滚动展示长列表或区域。在小程序中,可以使用scroll-view组件实现下拉刷新。 下拉刷新函数:在scroll-view组件的bindscrolltolower属性中绑定一个触发事件…

    Java 2023年5月23日
    00
  • Windows 下修改Tomcat jvm参数的方法

    完整攻略:Windows下修改Tomcat jvm参数的方法 1. 概述 Tomcat是一个非常常用的Java Web应用服务器,我们可以通过修改Tomcat的jvm参数来进行性能优化或解决一些启动或运行时遇到的问题。本文将介绍在Windows环境下如何修改Tomcat的jvm参数的方法和注意事项。 2. 修改方法 2.1 直接在命令行中设置jvm参数 我们…

    Java 2023年6月2日
    00
  • JWT Token实现方法及步骤详解

    JWT Token实现方法及步骤详解 什么是JWT Token JWT(JSON Web Token)是一种用于访问网络资源的安全令牌。JWT用于在客户端和服务器之间安全地传输被称为声明的信息。 JWT包括三个部分,即头部(header)、载荷(payload)和签名(signature)。其中,头部是一个由两个字段组成的JSON对象,分别是类型(typ)和…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部