跨域不是前端的事情,后端也一样要解决跨域。SpringBoot解决跨域的问题

SpringBoot解决跨域问题

接触Java的时间并不是很长,我一直以为跨域是前端需要解决的问题。直到有一天,一个前端的技术经理跟我说cityMaker无法处理跨域问题的时候,我才意识到跨域问题的严重性。因此有了这篇文章。

跨域

在说明跨域之前,我还是希望能把问题由来还原,以加深对这次过程的印象。
这次的后端接口不多,就几个统计数据的接口,前端使用cityMaker做的大屏端展示数据(美名曰“驾驶仓”)。由于驾驶仓部署在其他远程服务器上,而后端接口在另外一台服务器,所以就出现了跨域问题。(这个原因是前端的技术经理跟我说的,我没有权限接触驾驶仓的服务器,所以就按照这个原因算吧!)

跨域
跨域通常指的是浏览器对javascript的同源策略的限制。
比如我碰到的问题就是浏览器相当于cityMaker,而后端服务相当于脚本,浏览器出于安全考虑,是无法得到我的后端服务数据的。

用几个例子展示可能会有更加清晰的认识:

例子中均为 index.html 调用 hello 服务。
在这里插入图片描述
上述情况非跨域。
在这里插入图片描述
上述情况跨域,因为图中的主域名不一样。
在这里插入图片描述
上述情况跨域,因为图中的子主域名不一样。
在这里插入图片描述
上述情况跨域,因为图中的端口不一样,hello默认使用ng的80端口代理。
在这里插入图片描述
上述情况跨域,因为图中的协议不一样。

思考

看到这里需要有一个疑问,当我们在本地调试的时候,用127.0.0.1调用localhost会跨域吗?

SpringBoot中解决跨域

SpringBoot中解决跨域我一般采用两种办法。

  1. 利用SpringBoot自己原生的跨域策略,在Controller上添加注解 @CrossOrigin
    跨域不是前端的事情,后端也一样要解决跨域。SpringBoot解决跨域的问题_第1张图片

@CrossOrigin的更多用法需要自行搜索。

需要的同学可以参考博客园大佬 淼淼之森 的文章:注解@CrossOrigin解决跨域问题

  1. 自己写一个过滤器,放行跨域请求,过滤器的规则可以视项目情况做修改。
@Component
public class SimpleCORSFilter implements Filter {

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) res;
        response.setHeader("Access-Control-Allow-Origin", "*"); //解决跨域访问报错
        response.setHeader("Access-Control-Allow-Methods", "POST, PUT, GET, OPTIONS, DELETE");
        response.setHeader("Access-Control-Max-Age", "3600"); //设置过期时间
        response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, client_id, uuid, Authorization, access_token");
        chain.doFilter(req, res);
    }

    public void init(FilterConfig filterConfig) {}

    public void destroy() {}

}

我是嚓糕,土木狗转的程序猿,本文end。

你可能感兴趣的:(Java,java,javascript)