Spring boot解决跨域问题

本文详细介绍了SpringBoot中解决跨域问题的三种方法:通过在启动类中加入corsFilter、创建自定义filter以及使用@CrossOrigin注解。同时,文章强调了在使用Security框架时,需调整axios配置以发送cookie,确保跨域请求的成功。

spring boot解决跨域问题有三种方式:

1、在启动类中加入corsFilter

如下

private CorsConfiguration buildConfig() {
   CorsConfiguration corsConfiguration = new CorsConfiguration();
   corsConfiguration.addAllowedOrigin("*"); // 1
   corsConfiguration.addAllowedHeader("*"); // 2
   corsConfiguration.addAllowedMethod("*"); // 3
   corsConfiguration.setAllowCredentials(true);
   return corsConfiguration;
}


@Bean
public CorsFilter corsFilter() {
   UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
   source.registerCorsConfiguration("/**", buildConfig()); // 4
   return new CorsFilter(source);
}

第二种生成一个filter

spring boot生成filter的方式也有两种

1、写一个继承filter的filter

public class CorsFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public  void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
            throws ServletException, IOException {
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        response.setContentType("application/json; charset=utf-8");
        response.setCharacterEncoding("UTF-8");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Methods", "POST, GET,PUT, OPTIONS, DELETE");
        response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
        response.setHeader("Access-Control-Allow-Credentials", "true");
        response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, token");
        filterChain.doFilter(request, response);
        System.out.println("===============================================test =======================================");
    }

    @Override
    public void destroy() {
    }

然后再启动类中注册这个filter

@Bean
public FilterRegistrationBean testFilterRegistration() {
   FilterRegistrationBean registration = new FilterRegistrationBean();
   registration.setFilter(new com.zf.osaos.core.hybtest.CorsFilter());
   registration.addUrlPatterns("/*");
   registration.addInitParameter("paramName", "paramValue");
   registration.setName("testFilter");
   registration.setOrder(1);
   return registration;
}
2、同样先生成一个filter
@Order(1)
@WebFilter(filterName = "testFilter1", urlPatterns = "/*")
public class CorsFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public  void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
            throws ServletException, IOException {
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        response.setContentType("application/json; charset=utf-8");
        response.setCharacterEncoding("UTF-8");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Methods", "POST, GET,PUT, OPTIONS, DELETE");//http请求方式
        response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
        response.setHeader("Access-Control-Allow-Credentials", "true");
        response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, token");
        filterChain.doFilter(request, response);
        System.out.println("===============================================test =======================================");
    }

    @Override
    public void destroy() {
    }
注意:两个注解,@order代表注解表示执行过滤顺序,值越小,越先执行

然后在启动类中加入注解@ServletComponentScan

仅仅有了这些当然是不够的--------》

在实际开发过程中,发现跨域问题并不是那么好解决的,因为Springboot安全控制框架使用了Securtiy,它的身份认证基于 JSESSIONID,而axios框架默认是不发送cookie的,因此需要在axios配置中添加 

axios.defaults.withCredentials = true;
axios.defaults.withCredentials = true

第三种方式:

在Controller对应的方法上加上

org.springframework.web.bind.annotation.CrossOrigin 的@CrossOrigin

或者直接在整个controller类上加

@CrossOrigin(origins = "http://domain2.com",
        maxAge = 3600,
        methods = {RequestMethod.GET, RequestMethod.POST})
@RestController
public class UserController
 

感谢!

### Spring Boot 中配置 CORS 以解决资源共享问题 #### 方法一:使用 `@CrossOrigin` 注解 在控制器类或特定方法上可以使用 `@CrossOrigin` 注解来允许来自指定源的请求。这种方式适合于细粒度控制,即针对某个接口或一组接口设置不同的策略。 ```java import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class MyController { @CrossOrigin(origins = "http://example.com") @GetMapping("/greeting") public String greeting() { return "Hello, World!"; } } ``` 此代码片段展示了如何在一个具体的 HTTP GET 请求处理器上启用支持[^4]。 #### 方法二:全局配置 CORS 支持 对于更广泛的需求,比如整个应用程序都需要统一的访问规则,则可以通过创建一个 WebMvcConfigurer 的 Bean 来定义全局性的 CORS 策略: ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("http://example.com") .allowCredentials(true); } } ``` 需要注意的是,在启用了凭证传输的情况下(`.allowCredentials(true)`),不允许将 `.allowedOrigins()` 设置为 `"*"` ,这会导致安全错误[^5]。 以上两种方式均能有效帮助开发者应对不同场景下的挑战,并确保前后端交互顺畅无阻。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值