解决方案:SpringBoot分布式项目跨域
场景:
-
web端:localhost:8001
-
后台user服务:localhost:9001
-
请求:web端请求 后台user服务,报跨域异常
异常信息:
Access to XMLHttpRequest at 'http://localhost:9001/user/register' from origin 'http://localhost:8001' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
jquery.min.js:4 POST http://localhost:9001/user/register net::ERR_FAILED 400

解决方式一:使用@CrossOrigin注解
- 在前端代码不做任何修改的情况下,实现跨域
- @CrossOrigin注解配置某一个方法接受某一个域的请求
/**
* 用户注册
* @param name
* @param password
* @return
*/
@CrossOrigin(value = "http://localhost:8001")
@PostMapping("/register")
public Result register(@RequestParam("name") String name,
@RequestParam("password") String password){
System.out.println("register...");
Result result = userService.addUser(name, password);
return result;
}

解决方式二:通过自定义Filter来解决跨域问题
自定义过滤器
/**
* 自定义跨域过滤器,实现对请求的跨域配置
*/
@WebFilter(filterName = "ajaxCorsFilter" , servletNames = {"dispatcherServlet"})
public class CrosFilter 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;
System.out.println("跨域处理... ...");
//*号表示对所有请求都允许跨域访问
res.addHeader("Access-Control-Allow-Origin", "*");
res.addHeader("Access-Control-Allow-Methods", "*");
//放行请求
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
}
}
@SpringBootApplication
@MapperScan(basePackages = "com.dabing.ovls.user.dao")
@ServletComponentScan //扫描跨域过滤器
public class UserBootApplication {
public static void main(String[] args) {
SpringApplication.run(UserBootApplication.class,args);
}
}

缺点:每一个方法上都去加注解比较繁琐
解决方式三:通过 全局配置类 来解决跨域问题
通过全局配置类中,重写addCorsMappings方法
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**") //**表示本应用的所有方法都会去处理跨域请求
.allowedOrigins("http://localhost:8001") //allowedOrigins("*")
.allowedMethods("*") //allowedMethods表示允许通过的请求数("GET","POST", "PUT", "DELETE")
.allowedHeaders("*"); //allowedHeaders则表示允许的请求头
}
}


本文探讨了SpringBoot应用中如何解决前端与后台服务间的跨域问题,包括使用@CrossOrigin注解、自定义CORS Filter和全局配置类的三种方法,并分析了各自的优缺点。
1027

被折叠的 条评论
为什么被折叠?



