Java后端解决跨域问题的一种方法

2022-11-29 20:34:30 浏览数 (1)

Ajax请求会出现跨域问题,前端页面报错如下:

代码语言:javascript复制
Access to XMLHttpRequest at 'xxxx' from origin 'xxxx' has been blocked by CORS policy: Request header field content-type is not allowed by Access-Control-Allow-Headers in preflight response.

一、什么是跨域? 简单地理解就是因为JavaScript同源策略的限制,a.com 域名下的js无法操作b.com或是c.a.com域名下的对象。 同源是指相同的协议、域名、端口。特别注意两点: 如果是协议和端口造成的跨域问题“前台”是无能为力的, 在跨域问题上,域仅仅是通过“协议 域名 端口”来识别,两个不同的域名即便指向同一个ip地址,也是跨域的。

二、常见跨域情况

代码语言: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://192.168.1.1/b.js            域名和域名对应ip                   不允许

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              不同域名                          不允许

具体解决办法如下,仅供参考: 1)添加一个过滤方法,代码如下:

代码语言:javascript复制
package com.lcry.filter;

import javax.servlet.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
 * @author lcry
 * @create 2019/1/4
 */
public class SessionListener  implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // TODO Auto-generated method stub

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain chain) throws IOException, ServletException {
        HttpServletResponse httpServletResponse=(HttpServletResponse) response;
        httpServletResponse.setHeader("Access-Control-Allow-Origin", "*");
        chain.doFilter(request, response);


    }

    @Override
    public void destroy() {
        // TODO Auto-generated method stub

    }
}

2)配置web.xml,添加拦截

代码语言:javascript复制
  <!--解决跨域问题-->
  <filter>
    <filter-name>SessionListener</filter-name>
    <filter-class>com.lcry.filter.SessionListener</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>SessionListener</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

这样就能解决ajax跨域问题。

0 人点赞