今天遇到一个很奇怪的问题,就是我postman测试的好好的可以访问,但是前端一请求就出了一个跨域的异常,其实这个问题很好解决,只需要配置一下就好了。
只需要下面两个类
首先我们需要自定义一个过滤器,但是要实现Filter接口的话,得有spring-boot-start-web的依赖,问题又来了 gateway的依赖刚好和spring-boot-start-web冲突了 所以咱们就不可以引入spring-boot-start-web的依赖,gateway的依赖又没有对应的Filter接口,所以咱们用另一个依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>
引入完依赖之后,去写咱们的过滤器(WebCrossFilter)
/**
* 跨域过滤器
* @author: shenwang
* Date: 2021/12/3
*/
public class WebCrossFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletResponse res = (HttpServletResponse)servletResponse;
HttpServletRequest req = (HttpServletRequest)servletRequest;
res.setHeader("Access-Control-Allow-Origin", req.getHeader("Origin"));
res.setHeader("Access-Control-Allow-Methods", "GET,POST,OPTIONS,PUT,DELETE");
res.setHeader("Access-Control-Max-Age", "3600");
res.setHeader("Access-Control-Allow-Headers", req.getHeader("Access-Control-Request-Headers"));
res.setHeader("Access-Control-Allow-Credentials", "true");
if (req.getMethod().equals(RequestMethod.OPTIONS.name())) {
res.setStatus(HttpStatus.OK.value());
} else {
filterChain.doFilter(servletRequest, servletResponse);
}
}
@Override
public void destroy() {
}
}
紧接着写咱们的配置类(WebFilterConfig)
/**
* 前端过滤器配置
* @author shenwang
* @version 1.0
*/
@Configuration
public class WebFilterConfig {
@Bean
public FilterRegistrationBean webCrossFilterRegistration() {
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(new WebCrossFilter());
registration.addUrlPatterns("/**");
registration.addInitParameter("paramName", "paramValue");
registration.setName("webCrossFilter");
return registration;
}
}
最后咱们前端访问咱们的gateway就不会出现跨域问题啦
当然还有在配置文件中(application.yml)配置的方法,个人还是比较喜欢写在类上面 看配置文件脑袋疼哈哈哈