zoukankan      html  css  js  c++  java
  • 【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:* 表示

  • 相关阅读:
    sql server的for xml path与变通的行转列
    nginx产生【413 request entity too large】错误的原因与解决方法
    spring的15个经典面试题
    数据库死锁预防规范
    服务端高并发分布式架构的演进
    后端接口统一返回响应对象
    数据库的dml、ddl和dcl的概念
    [na]ip routing&no ip routing
    [na]一站式学习wireshark
    [na]tcpdump参数应用参考
  • 原文地址:https://www.cnblogs.com/panie2015/p/6419778.html
Copyright © 2011-2022 走看看