【Access-Control-Allow-Origin】跨域问题
【前言】
在实际项目中,可能是多个项目共同完成某个功能,他们之间需要实现数据的交互。这样就会需要有跨域的问题。
比如,发布在不同电脑上的不同项目之间,用不同语言开发的项目之间……
【JSONP】
当使用Ajax 跨域访问的时候,比较常用的方法是 JSONP,这种方法目前只支持GET 方法
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的配置
<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 接口
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/
如果您希望与我交流互动,欢迎加我微信
本文内容为作者辛苦整理书写,欢迎转载,但请保留文章出处