美文网首页devops
Spring Boot 跨域过滤器(过滤器跨域问题)

Spring Boot 跨域过滤器(过滤器跨域问题)

作者: 不敢预言的预言家 | 来源:发表于2018-06-29 11:10 被阅读0次

重写WebMvcConfigurer#addCorsMappings()可以解决一部分跨域的问题,但是对于有些过滤器涉及到跨域,且拦截器位面较高的话,还是会出现一些跨域问题。

配置 CorsFilter 跨域过滤器,一劳永逸

CorsFilterRegistrationConfig

package site.yuyanjia.template.common.config;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;

import java.util.ArrayList;
import java.util.List;

/**
 * 跨域过滤器
 *
 * @author seer
 * @date 2018/6/29 10:09
 */
@Configuration
@ConfigurationProperties(prefix = CorsFilterRegistrationConfig.PREFIX)
public class CorsFilterRegistrationConfig {
    public static final String PREFIX = "yuyanjia.filter.cors";

    /**
     * 允许跨域地址
     * 允许所有:*
     */
    private List<String> allowedOriginList = new ArrayList<>();

    /**
     * 允许请求头信息
     * 允许所有:*
     */
    private List<String> allowedHeaderList = new ArrayList<>();

    /**
     * 允许请求信息
     * 允许所有:*
     */
    private List<String> allowedMethodList = new ArrayList<>();

    /**
     * 允许暴露信息
     */
    private List<String> exposedHeaderList = new ArrayList<>();

    /**
     * 允许证书
     */
    private Boolean allowCredentials = true;


    /**
     * 缓存时间
     */
    private Long maxAge = 3600L;

    /**
     * 过滤地址
     */
    private String mapping = "";

    /**
     * 跨域过滤器
     *
     * @return
     */
    @Bean
    public FilterRegistrationBean CrosFilterRegistrationBean() {

        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.setAllowedOrigins(allowedOriginList);
        corsConfiguration.setAllowedHeaders(allowedHeaderList);
        corsConfiguration.setAllowedMethods(allowedMethodList);
        corsConfiguration.setExposedHeaders(exposedHeaderList);
        corsConfiguration.setMaxAge(maxAge);
        corsConfiguration.setAllowCredentials(allowCredentials);

        UrlBasedCorsConfigurationSource configurationSource = new UrlBasedCorsConfigurationSource();
        configurationSource.registerCorsConfiguration(mapping, corsConfiguration);

        CorsFilter corsFilter = new CorsFilter(configurationSource);

        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(corsFilter);
        filterRegistrationBean.setOrder(0);
        return filterRegistrationBean;
    }

    public List<String> getAllowedOriginList() {
        return allowedOriginList;
    }

    public void setAllowedOriginList(List<String> allowedOriginList) {
        this.allowedOriginList = allowedOriginList;
    }

    public List<String> getAllowedHeaderList() {
        return allowedHeaderList;
    }

    public void setAllowedHeaderList(List<String> allowedHeaderList) {
        this.allowedHeaderList = allowedHeaderList;
    }

    public List<String> getAllowedMethodList() {
        return allowedMethodList;
    }

    public void setAllowedMethodList(List<String> allowedMethodList) {
        this.allowedMethodList = allowedMethodList;
    }

    public List<String> getExposedHeaderList() {
        return exposedHeaderList;
    }

    public void setExposedHeaderList(List<String> exposedHeaderList) {
        this.exposedHeaderList = exposedHeaderList;
    }

    public Boolean getAllowCredentials() {
        return allowCredentials;
    }

    public void setAllowCredentials(Boolean allowCredentials) {
        this.allowCredentials = allowCredentials;
    }

    public Long getMaxAge() {
        return maxAge;
    }

    public void setMaxAge(Long maxAge) {
        this.maxAge = maxAge;
    }

    public String getMapping() {
        return mapping;
    }

    public void setMapping(String mapping) {
        this.mapping = mapping;
    }
}

application.yml

yuyanjia:
  filter:
    cors:
      allowed-origin-list:
       - '*'
      allowed-header-list:
       - '*'
      allowed-method-list:
       - POST
       - GET
      exposed-header-list:
       - access-control-allow-headers
       - access-control-allow-methods
       - access-control-allow-origin
       - access-control-max-age
       - X-Frame-Options
      mapping: /website/**

推荐一些关于HTTP请求的相关资料,有助于了解跨域请求

Access-Control-Allow-Origin 这个里有跨域相关属性设置的一切概念解释
前端 | 浅谈preflight request
HTTP响应头和请求头信息对照表
四种常见的 POST 提交数据方式对应的content-type取值 Spring Boot 会根据 Content-type 确定 HttpMessageConverter

相关文章

  • 新增-后端跨域

    前端程序 后端程序 现在请求无法,到达需要解决跨域问题 每个servlet单独做跨域设置 跨域过滤器

  • Spring Boot 跨域过滤器(过滤器跨域问题)

    重写WebMvcConfigurer#addCorsMappings()可以解决一部分跨域的问题,但是对于有些过滤...

  • 跨域配置

    SpringBoot跨域配置 我们的后端使用Spring Boot。Spring Boot跨域非常简单,只需书写以...

  • 2019-04-01

    Spring Boot轻松跨域:Spring Boot中采用注解轻松实现跨域的一个基础例子 1.项目结构,conf...

  • 2018-12-11

    spring security 的跨域问题 spring security跨域设置 在spring-sercuri...

  • Spring boot2.4版本跨域问题

    问题描述 spring boot2.4版本之后,延用2.3的跨域方式,访问swagger出错. 2.3版本跨域配置...

  • spring boot + VUE跨域处理

    在使用 vue 做前端开发时,碰到 vue 请求接口出现跨域问题。解决的方法,就在后台添加一个跨域请求的过滤器,来...

  • 响应头设置跨域和Spring注解跨域

    CORS跨域原理详解Spring解决跨域 响应头设置跨域 Spring注解跨域@CrossOrigin 可添加到方...

  • SpringBoot+Vue数据交互

    后端框架Spring Boot,前端框架vue 1. 跨域+携带cookie 跨域-携带cookie 2. 拦截器...

  • Spring Boot打war包部署遇到的坑

    Spring Boot解决跨域问题 在Controller层加入@CrossOrigin注解即可 部署 pom.x...

网友评论

    本文标题:Spring Boot 跨域过滤器(过滤器跨域问题)

    本文链接:https://www.haomeiwen.com/subject/boooyftx.html