【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:* 表示
作者:panie
出处:http://www.cnblogs.com/panie2015/
如果您希望与我交流互动,欢迎加我微信
本文内容为作者辛苦整理书写,欢迎转载,但请保留文章出处
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?