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注解注释的方法一定要记得抛出异常哦,否则全局异常处理感知不到异常哦
浙公网安备 33010602011771号