【JS】AJAX跨域-被调用方与调用方解决方案(二)

解决跨域问题

  跨域问题说明,参考【JS】AJAX跨域-JSONP解决方案(一)

  实例,使用上一章(【JS】AJAX跨域-JSONP解决方案(一))的实例

  解决方案三(被调用方支持跨域)

  被调用方解决,基于支持跨域的解决思路,基于Http协议关于跨域的相关规定,在响应头里增加指定的字段告诉浏览器,允许调用

  跨域请求是直接从浏览器发送到被调用方,被调用方在响应头里增加相关信息,返回到页面,页面能正常获取请求内容。

  1、服务端增加一个过滤器(CrossFilter.java),过滤所有请求,在请求响应中增加内容,如下:

 1 package com.test.ajax.cross.filter;
 2
 3 import java.io.IOException;
 4
 5 import javax.servlet.Filter;
 6 import javax.servlet.FilterChain;
 7 import javax.servlet.FilterConfig;
 8 import javax.servlet.ServletException;
 9 import javax.servlet.ServletRequest;
10 import javax.servlet.ServletResponse;
11 import javax.servlet.http.HttpServletRequest;
12 import javax.servlet.http.HttpServletResponse;
13
14 import org.springframework.util.StringUtils;
15
16 /**
17  * 服务端解决跨域
18  * @author h__d
19  *
20  */
21 public class CrossFilter implements Filter {
22
23     @Override
24     public void init(FilterConfig filterConfig) throws ServletException {
25         // TODO Auto-generated method stub
26
27     }
28
29     @Override
30     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
31             throws IOException, ServletException {
32         HttpServletResponse res = (HttpServletResponse) response;
33
34         HttpServletRequest req = (HttpServletRequest) request;
35
36         // 支持所有域
37         String origin = req.getHeader("Origin");
38         if (!StringUtils.isEmpty(origin)) {
39             // 支持任何域名的跨域调用 且 支持带cookie(是被调用方域名的cookie,而不是调用方的cookie)
40             res.addHeader("Access-Control-Allow-Origin", origin);
41         }
42         // 指定允许的域,带cookie时,origin必须是全匹配,不能使用 *
43 //        res.addHeader("Access-Control-Allow-Origin","http://localhost:8081");
44         // 允许所有域,但不能满足带 cookie 的跨域请求
45 //        res.addHeader("Access-Control-Allow-Origin","*");
46
47         // 支持所有自定义头
48         String headers = req.getHeader("Access-Control-Allow-Headers");
49         if (!StringUtils.isEmpty(headers)) {
50             // 允许所有header
51             res.addHeader("Access-Control-Allow-Headers", headers);
52         }
53         // 允许所有header
54 //        res.addHeader("Access-Control-Allow-Headers","*");
55
56         // 指定允许的方法
57 //        res.addHeader("Access-Control-Allow-Methods","GET");
58         // 允许所有方法
59         res.addHeader("Access-Control-Allow-Methods", "*");
60         // 允许浏览器在一个小时内,缓存跨域访问信息(即上面三个信息)
61         res.addHeader("Access-Control-Max-Age", "3600");
62         // 启用 cookie
63         res.addHeader("Access-Control-Allow-Credentials", "true");
64
65         chain.doFilter(request, response);
66
67     }
68
69     @Override
70     public void destroy() {
71         // TODO Auto-generated method stub
72
73     }
74
75 }

  2、在web.xml文件中注册过滤器

<filter>
    <filter-name>CrossFilter</filter-name>
    <filter-class>com.test.ajax.cross.filter.CrossFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>CrossFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

  3、编辑测试界面,test3.html

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4 <meta charset="UTF-8">
 5 <title>Insert title here</title>
 6 <script src="jquery-1.11.3.min.js" type="text/javascript"></script>
 7 </head>
 8 <body>
 9     <h2>测试服务端解决跨域问题</h2>
10     <a href="#" onclick="get()">发送get请求</a>
11 </body>
12 <script type="text/javascript">
13     function get(){
14         $.getJSON("http://localhost:8080/test-ajax-cross/test/get").then(function(result){
15             console.log(result);
16             $("body").append("<br>" + JSON.stringify(result));
17         });
18     }
19 </script>
20 </html>

  4、在浏览器中输入地址进行访问,http://a.com:8080/test-ajax-cross/static/test3.html

    

  

  解决方案四(被调用方支持跨域)

原文地址:https://www.cnblogs.com/h--d/p/11478967.html

时间: 2024-10-12 22:25:08

【JS】AJAX跨域-被调用方与调用方解决方案(二)的相关文章

将微博或者qq空间的说说同步至博客园 wcf+js(ajax)跨域请求(1)

前天刚写了篇文章使用Bootstrap为你的博客园自定义轮播图片(今天将图片加载的顺序调整了下,不在访问的时候直接加载,而是页面加载最后在脚本里面动态添加dom元素),虽说技术含量不怎么高,但是大家还算感兴趣.其实对博主来说最关键是博客的积分在涨.所以趁热打铁,再来一篇使用wcf+js ajax跨域请求数据同步空间说说的帖子. 因为是请求qq说说的数据,所以要登陆我的qq,这个很麻烦,总不能让每个访客都登陆的qq,然后把数据取出来吧,而且qq也没有相关的接口提供,登陆的时候还要处理验证码.所以这

js ajax跨域被阻止 CORS 头缺少 &#39;Access-Control-Allow-Origin&#39;(转)

今天ajax请求域名的时候出现 已阻止跨源请求:同源策略禁止读取位于 http://www.zuimeimami.com*****的远程资源.(原因:CORS 头缺少 'Access-Control-Allow-Origin'). 解决办法1: var url='http://localhost:8080/WorkGroupManagment/open/getGroupById" +"?id=1&callback=?'; $.ajax({ url:url, dataType:'

js Ajax跨域调用JSON并赋值全局变量

//跨域调用JSON <script type="text/javascript"> function _callback(obj) { alert(obj); } jQuery(document).ready(function(){ $.ajax({ type : "get", async:true, url: "http://www.xxx.com/api/token/getcode", dataType : "json

ajax跨域实现api 接口调用

背景: 想实现跨域去调用接口, 然后同时支持下次调用,能够带cookie信息过来,同时支持来自多个源头的域名的跨域调用. 1.这样支持来自所有域名的跨域调用: 不支持跨域是,浏览器报错: 在api接口服务端加上相应的协议头: header("Access-Control-Allow-Origin: *',); header('Access-Control-Allow-Headers: X-Requested-With, Content-Type'); 但是,这样的api接口,不支持cookie.

JS AJAX 跨域

原因: 浏览器的同源策略,不允许AJAX 访问 其他接口 协议,域名,端口 一个不同 就跨域了  http 端口(80) https(443) 可以跨域的三个标签: 1. img : 打点统计,没有浏览器兼容问题 2. srcipt  可以使用CDN ,JSONP 3. link    使用CDN 跨域注意: 所有跨域请求都必须经过信息提供方允许 服务器端设置 http header response.setHeader('Access-Control-Allow-Origin', 'http:

Jquery Ajax 跨域调用asmx类型 WebService范例

摘要:Ajax 在 Web 2.0 时代起着非常重要的作用,然而有时因为同源策略(SOP)(俗称:跨域问题(cross domain)) 它的作用会受到限制.在本文中,将学习如何克服合作限制.本文以asmx方式搭建webservice作为测试用后端,给出完整的前后端调用解决方案.范例代码. 关键词: jquery ajax 跨域  webservice  asmx  cross-domain 0 问题分析 0.1 什么是跨域问题? 越来越多的网站需要相互协作.例如,在线房屋租赁网站需要谷歌地图的

自己的项目结合MVC实现ajax跨域调用

好久没写东西了,自我检讨一下,写不完这篇不下班!! 最近在做一个项目模块通用的分享功能插件,由于各个模块调用所以会出现跨域问题,正好之前同事解决过,于是自己亲身实践把这次解决问题的经历记录下来.闲言少叙,书归正传~ 首先,项目背景,一个基于jquery的分享插件开发,自己也是尝试着写这么个东西,第一次写,质量肯定差,下次博文把这次开发经历写出来.由于这次解决ajax跨域的方法很简单,我就粘贴代码简单说明一下. 第一步:编写后台程序,MVC下代码如下:      //这是一个获取某个用户的通讯录分

以短链服务为例,探讨免AppKey、免认证、Ajax跨域调用新浪微博API

新浪微博的API官方提供了很多种调用方式,支持编程的,归根结底就是两种: 1.基于Oauth协议,使用Open API.(http://open.weibo.com/wiki/%E6%8E%88%E6%9D%83%E6%9C%BA%E5%88%B6%E8%AF%B4%E6%98%8E) 2.使用Weibo JS-SDK(http://open.weibo.com/sdk/js ). 官方的方式总是显得很麻烦.我们来探讨一下,能不能通过非官方的方法,免AppKey.免认证.Ajax跨域调用新浪微博

AJAX跨域调用相关知识-CORS和JSONP(引)

AJAX跨域调用相关知识-CORS和JSONP 1.什么是跨域 跨域问题产生的原因,是由于浏览器的安全机制,JS只能访问与所在页面同一个域(相同协议.域名.端口)的内容. 但是我们项目开发过程中,经常会遇到在一个页面的JS代码中,需要通过AJAX去访问另一个服务器并返回数据,这时候就会受到浏览器跨域的安全限制了. 这里要注意,如果只是通过AJAX向另一个服务器发送请求而不要求数据返回,是不受跨域限制的.浏览器只是限制不能访问另一个域的数据,即不能访问返回的数据,并不限制发送请求. 我们接下来就为