Springboot解决项目中跨域问题
在项目实际开发中,前后端分离情况下,我们后端开发就要注意跨域问题导致请求失败。
比如:前端vue请求接口,就出现下面的情况:
解决方案
前端解决:
如果让vue前端来解决这个问题怎么办?vue采用axios请求,我们可以改变它的请求方式来达到我们的目的。
这里不再讲解使用jsonp的方式来解决跨域,因为jsonp方式只能通过get请求方式来传递参数,而且有一些不便之处。
我们今天着重讲下后端怎么解决
后端解决方案:
注解方式@CrossOrigin
@CrossOrigin这个注解是自带的,我们可以在方法和类上都可以采用该注解。在方法上注解,就只能该方法实现了跨域请求。
@RestController
@RequestMapping("/user")
@CrossOrigin
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/findAll")
public Object findAll(){
return userService.list();
}
}
我们来测试一下跨域解决了没有
成功解决了。但是这个只能限制到这个类上,如果我们采用整个项目进行跨域请求怎么办?我们可以采用第二个方法。
实现WebMvcConfigurer
我们定义一个配置类,让这个类实现实现WebMvcConfigurer接口的addCorsMappings方法即可
测试一下同样可以解决
还记得前端js处理跨域请求吗。我们是采用header中添加一些跨域参数,这就是第三个办法解决跨域请求,在header中添加跨域参数,来告诉浏览器忽略跨域问题。
过滤器的办法
@Component
public class CORSFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletResponse res = (HttpServletResponse) response;
res.addHeader("Access-Control-Allow-Credentials", "true");
res.addHeader("Access-Control-Allow-Origin", "*");
res.addHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");
res.addHeader("Access-Control-Allow-Headers", "Content-Type,X-CAF-Authorization-Token,sessionToken,X-TOKEN");
if (((HttpServletRequest) request).getMethod().equals("OPTIONS")) {
response.getWriter().println("ok");
return;
}
chain.doFilter(request, response);
}
@Override
public void destroy() {
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
}
这个就是我们java中的过滤器的办法,同样可以解决。
服务器办法
nginx请求中,我们可以在header中添加参数来实现跨域请求的。
location / {
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers X-Requested-With;
add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;
if ($request_method = 'OPTIONS') {
return 204;
}
}
这样也是可以的。
我能想到的就是这些了,大家有没有更好的办法来解决,分享下。欢迎大家关注我