【Access-Control-Allow-Origin】跨域问题

【前言】

  在实际项目中,可能是多个项目共同完成某个功能,他们之间需要实现数据的交互。这样就会需要有跨域的问题。

  比如,发布在不同电脑上的不同项目之间,用不同语言开发的项目之间……

【JSONP】

  当使用Ajax 跨域访问的时候,比较常用的方法是 JSONP,这种方法目前只支持GET 方法

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
function TestAjax() {
    var url ="/geturl";
    var data = $.parseJSON('{
            "equObjCode" : "1111"
        }');
 
    $.ajax({
        type : "get",
        async : false,
        url : url,
        data : data,
        //cache : false, //默认值true
        dataType : "jsonp",
        jsonp : "callback",//传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(默认为:callback)
        jsonpCallback : "jsonpCallback",
        //自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名
        //如果这里自定了jsonp的回调函数,则success函数则不起作用;否则success将起作用
        success : function(data) {
            alert(JSON.stringify(data));
        },
        error : function(XMLHttpRequest, textStatus) {
            alert(XMLHttpRequest.status + ","
                    + XMLHttpRequest.readyState + ",error="
                    + textStatus);
        }
    });
}

  

【java】

  在java web 项目中实现跨域方式,可以用 filter 实现跨域访问问题

  

web.xml 中需要添加此filter的配置  

1
2
3
4
5
6
7
8
9
10
11
12
<filter>
    <filter-name>crossOrigin</filter-name>
    <filter-class>com.bkc.core.filter.CrossOriginFilter</filter-class>
    <init-param>
        <param-name>isAllowCross</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>crossOrigin</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

  实现 Filter 接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package com.bkc.core.filter;
 
import java.io.IOException;
 
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
public class CrossOriginFilter implements Filter
{
    private boolean isAllowCross = false;
 
    @Override
    public void destroy()
    {
        isAllowCross = false;
    }
 
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
        throws IOException, ServletException
    {
        if(isAllowCross){
            HttpServletRequest httpServletRequest = (HttpServletRequest)request;
            HttpServletResponse httpServletResponse = (HttpServletResponse)response;
            System.out.println("拦截请求: "+httpServletRequest.getServletPath());
            httpServletResponse.setHeader("Access-Control-Allow-Origin", "*"); 
            httpServletResponse.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); 
            httpServletResponse.setHeader("Access-Control-Max-Age", "0"); 
            httpServletResponse.setHeader("Access-Control-Allow-Headers", "Origin, No-Cache, X-Requested-With, If-Modified-Since, Pragma, Last-Modified, Cache-Control, Expires, Content-Type, X-E4M-With,userId,token"); 
            httpServletResponse.setHeader("Access-Control-Allow-Credentials", "true"); 
            httpServletResponse.setHeader("XDomainRequestAllowed","1"); 
        }
        chain.doFilter(request, response);
    }
 
    @Override
    public void init(FilterConfig filterConfig)
        throws ServletException
    {
        String isAllowCrossStr = filterConfig.getInitParameter("isAllowCross");
        isAllowCross = isAllowCrossStr.equals("true");           
    }
     
}

  看代码可知,filter 有一个初始化参数 isAllowCross ,根据这个参数来设置此项目是否允许跨域访问。

  当允许跨域访问的时候,则在每一个返回的http 报文头中增加如下参数:

  (1)Access-Control-Allow-Origin:* 表示允许任何域名跨域访问。

    如果这样设置的话,需要考虑一下安全性。这里可以指定允许访问的域名即可。如Access-Control-Allow-Origin:www.baidu.com,www.client2.com

  (2)Access-Control-Allow-Headers:Origin, X-Requested-With, Content-Type, Accept

  (3)Access-Control-Allow-Methods:GET,POST

  

  Access-Control-Allow-Origin:* 表示

posted @   panie2015  阅读(645)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示