跨域问题的概述以及后端解决办法

什么是跨域问题?

        跨域问题是指从一个域名的网页向另外一个域名的网页请求资源。在javaWeb项目的开发中,如果采用前后端分离的架构进行开发就会出现跨域问题,跨域问题产生之后浏览器是禁止访问跨域资源的。这是由于浏览器的同源策略所造成的,是浏览器对javaScript施加的安全限制。

同源策略是指在如果访问的资源与当前的服务器的域名协议,域名,端口号有任意一个不同,则就认为是不同源的跨域访问

URL 说明 是否允许通信
http://www.a.com/a.js http://www.a.com/b.js 同一域名下 允许
http://www.a.com/lab/a.js http://www.a.com/script/b.js 同一域名下不同文件夹 允许
http://www.a.com:8000/a.js http://www.a.com/b.js 同一域名,不同端口 不允许
http://www.a.com/a.js https://www.a.com/b.js 同一域名,不同协议 不允许
http://www.a.com/a.js http://script.a.com/b.js 主域相同,子域不同 不允许
http://www.a.com/a.js http://a.com/b.js 同一域名,不同二级域名(同上) 不允许(cookie这种情况下也不允许访问)
http://www.cnblogs.com/a.js http://www.a.com/b.js 不同域名 不允许

为什么有跨域问题的出现?

跨域是为了解决安全问题,如果一个域名可以访问任意的资源,那么该域名下的服务器就很容易受到来自恶意服务器的攻击

为什么要跨域?

在一个公司中的网络划分了不同的子域,比如一个是location.company.com ,而应用是放app.company.com, 这时想从 app.company.com去访问location.company.com 的资源就属于跨域。

如何解决跨域问题?

1.前端解决方法(此处不作讨论)

2.后端解决方法

跨域资源共享(CORS)

        W3C 的 Web 工作组推荐了一种新的机制,即跨域资源共享(Cross-origin Resource Sharing),简CORS。其实这个机制就是实现了跨站访问控制

        服务器端对于CORS的支持,主要就是通过设置Access-Control-Allow-Origin来进行的。如果浏览器检测到相应的设置,就可以允许ajax进行跨域的访问。

        只需要在后台中加上响应头来允许域请求!在被请求的Response header中加入设置,就可以实现跨域访问

 实现这一过程的最好方法就是在过滤器中对servlet的响应头中加上允许访问的数据,代码实现如下:

public class CorsFilter implements Filter {
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
            throws IOException, ServletException {
        HttpServletResponse httpResponse = (HttpServletResponse) servletResponse;
        HttpServletRequest httpRequest = (HttpServletRequest) servletRequest;
        //允许携带Cookie时不能设置为* 否则前端报错
        httpResponse.setHeader("Access-Control-Allow-Origin", httpRequest.getHeader("origin"));//允许所有请求跨域
        httpResponse.setHeader("Access-Control-Allow-Methods", "*");//允许跨域的请求方法GET, POST, HEAD 等
        httpResponse.setHeader("Access-Control-Allow-Headers", "*");//允许跨域的请求头
        httpResponse.setHeader("Access-Control-Allow-Credentials", "true");//是否携带cookie
​
        filterChain.doFilter(servletRequest, servletResponse);
    }
}

猜你喜欢

转载自blog.csdn.net/yzl1293346757/article/details/127770774