Springboot解决项目中跨域问题

2,735 阅读2分钟

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;
   }
}

这样也是可以的。

我能想到的就是这些了,大家有没有更好的办法来解决,分享下。欢迎大家关注我