SpringBoot中配置跨域

SpringBoot中配置跨域

第一次遇到跨域问题是在自己的毕业设计上,先是前端vue项目中报错跨域问题,在vue的config中配置反向代理解决了。后来去到公司中,发现,直接全局定义请求ip和端口号作为前缀,拼接进请求url中也是不错的办法,一样的方便,配置反向代理的话还要在nginx中同样配置反向代理,反而显得更麻烦了。

SpringBoot这端,一开始以为只要前端配置了跨域就足够,然而发现,主要的跨域问题还是在后端,经过百度,发现SpringBoot解决跨域情趣十分简单,只要在Controller层添加@CrossOrigin注解就能解决,超方便,超快捷。

好的,进入主题。

进到公司后发现公司项目里的Controller上没有配置@CrossOrigin注解,这是怎么回事呢?但是,多了一个我没见过的CorsConfig配置类,代码如下:

package cn.com.wasec.gd_plice.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * 解决跨域问题
 */
@Configuration
public class CorsConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS")
                .allowCredentials(true)
                .maxAge(3600)
                .allowedHeaders("*");
    }
}

上面明确写着解决跨域问题的注释,那么说明这样也是能够解决跨域的。于是百度一下,发现这种方法是Spring内部的一种配置方式,通过实现WebMvcConfigurer,可以添加Spring中很多的配置。

很好的一篇对WebMVCConfigurer的解释的文章,连接如下:

zhangpower1993的博客 WebMvcConfigurer详解

同时趁着这个时候,就想总结下Java或者SpringBoot中解决跨域问题的方案,百度下发现一篇个人认为很好的文章,其中为SpringBoot解决跨域问题提供了四种方法,懒得照搬了,就自己看连接吧:

字母哥博客 详解SpringBoot应用跨域访问解决方案

Spring Boot配置跨域可以通过使用过滤器来实现。以下是一种常见的配置跨域的方法: 1. 创建一个过滤器类,例如`CorsFilter`,并实现`javax.servlet.Filter`接口。 2. 在过滤器类重写`doFilter`方法,用于处理跨域请求。 3. 在`doFilter`方法设置响应头,允许跨域访问。 4. 在Spring Boot配置注册过滤器。 下面是一个示例代码: ```java import org.springframework.core.Ordered; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @Component @Order(Ordered.HIGHEST_PRECEDENCE) public class CorsFilter implements Filter { @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletResponse response = (HttpServletResponse) res; HttpServletRequest request = (HttpServletRequest) req; response.setHeader("Access-Control-Allow-Origin", "*"); response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); response.setHeader("Access-Control-Max-Age", "3600"); response.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization, X-Requested-With"); if ("OPTIONS".equalsIgnoreCase(request.getMethod())) { response.setStatus(HttpServletResponse.SC_OK); } else { chain.doFilter(req, res); } } @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void destroy() { } } ``` 在上述代码,我们通过设置响应头来允许跨域访问。`Access-Control-Allow-Origin`设置为`*`表示允许所有来源的请求。`Access-Control-Allow-Methods`设置允许的请求方法,`Access-Control-Max-Age`设置预检请求的有效期,`Access-Control-Allow-Headers`设置允许的请求头。 然后,在Spring Boot配置注册这个过滤器: ```java import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class WebConfig { @Bean public FilterRegistrationBean<CorsFilter> corsFilterRegistrationBean() { FilterRegistrationBean<CorsFilter> registrationBean = new FilterRegistrationBean<>(); registrationBean.setFilter(new CorsFilter()); registrationBean.addUrlPatterns("/*"); registrationBean.setName("CorsFilter"); registrationBean.setOrder(1); return registrationBean; } } ``` 通过上述配置,我们将`CorsFilter`过滤器注册到Spring Boot,并设置了过滤器的顺序和拦截的URL模式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值