JQuery中ajax与SpringBoot后台跨域问题

一、SpringBoot 后端设置允许跨域请求的两种方式

1. 直接在允许跨域controller类上加@CrossOrigin注解

@CrossOrigin
@RestController
@RequestMapping("/user")
public class UserController {
    ......
}

2.继承WebMvcConfigurerAdapter类然后重写其中的addCorsMappings方法

class WebMvcConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
            	.allowCredentials(true)
                .allowedMethods("*")
                .allowedOrigins("*")
                .allowedHeaders("*");
    }
}

这两种方法实现的效果差不多,我没有具体深入研究。

但是注意这两种方法对于spring拦截器中返回的数据不起作用,(我猜对于filter中的返回也不起作用)

例如

你有一个检查是否登陆的拦截器,如果未登录就直接使用HttpServletResponse返回 错误码和错误信息。如果这个HttpServletResponse跨域则会受到同源策略的影响被阻塞(即使你使用上面两种方法中的一种)。所以在拦截器中返回数据时需要设置返回头信息

httpServletResponse.setHeader("Access-Control-Allow-Origin", "http://localhost:8081");
httpServletResponse.setHeader("Access-Control-Allow-Credentials","true");
httpServletResponse.setCharacterEncoding("UTF-8");
httpServletResponse.getWriter().write(o1);
通过这里我想在拦截器中是不是不要直接返回数据比较好,使用转发请求或者抛出异常的方式来处理拦截器检查不通过的情况,使用抛出自定义异常的方式配合Spring的全局异常处理(SpringBoot中也可以定制异常返回信息),经过测试在上面两种方法对于全局异常处理有效。

即下面这种方式返回错误信息

@ControllerAdvice
public class ExceptionHandle {
    @ResponseBody
    @ExceptionHandler(value = Exception.class)
    public Map handleException(Exception  e){
        Map<String,String> map = new HashMap<>();
        map.put("code","-100");
        return map;
    }
}

二、对于前端JQuery的AJAX请求,我发现不需要做任何处理,照常使用就行(如果只是简单的请求接收返回值的话,至于携带cookies数据之类的还没有尝试)

$.ajax({
            url:"xxxxxxxxxxxxxxxxxxxxxxxxx",
            dataType:"JSON",
            method:"GET",
            success:function (data) {
                console.info(data)
            },
        })

还是希望有时间去看看@CrossOrigin和addCorsMappings方法具体的实现是什么啊

tips:如果项目中有切面类并且有@Around注解注释的方法一定要记得抛出异常哦,否则全局异常处理感知不到异常哦

posted on 2021-02-19 10:03  lyfa  阅读(257)  评论(0)    收藏  举报

导航