解决方案:SpringBoot分布式项目跨域

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

解决方案: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则表示允许的请求头
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

穿城大饼

你的鼓励将是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值