有关Ajax跨域请求的解决方案
前言
最近博主在赶项目进度。所以微信二次开发那边的博文一直没有更新。后续时间会慢慢记录这个学习历程的。来年公司要开发微信小程序。到时也会记录一下历程。
闲话少说,今天在工作中遇到了SpringMVC接收json形式的参数需求,就自己写了一张页面发送Ajax请求来测试。由于不想再正开发的项目中添加无用的测试。就另起了一个Web项目来做。这样就遇到了一个新的问题。Ajax如何发送跨域请求。
刚开始想的是如何从JSP页面中发送这个请求。看了度娘中的帖子以及各大论坛中的相关方案,也尝试了不少。在此,就说一下自己的历程。
AJAX垮与请求实现方案一
首先是一种从JSP访问本地Servlet,然后经Servlet发送到服务器A中的Controller方式,不过很遗憾,没有解决博主的问题。但是还是值得来说一下这个思路的 - 在虚拟机中建立了一个项目来发送ajax请求,发送到虚拟机中的一个Servlet中。该Servlet代码片段如下:
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//创建一个指向外域(服务器)的链接
URL connect = new URL("http://192.168.1.184:9090/HanYiAPP/mine/test");
HttpURLConnection openConnection = (HttpURLConnection) connect.openConnection();
//服务器中设定请求方式的限制(最初是由JSP页面发起的POST请求。所以直接从请求中获取了)
openConnection.setRequestMethod(request.getMethod());
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
//获取Ajax发来的数据
Map<String, String[]> parameterMap = request.getParameterMap();
Set<Entry<String, String[]>> entrySet = parameterMap.entrySet();
Map<String,Object> map = new HashMap<String, Object>();
for (Entry<String, String[]> entry : entrySet) {
map.put(entry.getKey(), entry.getValue());
}
//转换成JSON对象
JSONObject jsonObject = new JSONObject(map);
//设置此URL连接可供输出
openConnection.setDoOutput(true);
OutputStreamWriter out = new OutputStreamWriter(openConnection.getOutputStream(),"UTF-8");
//输出
out.write(jsonObject.toJSONString());
out.flush();
//以下 用于接收服务器返回 的数据
StringBuffer data = new StringBuffer();
BufferedReader reader = new BufferedReader(new InputStreamReader(
openConnection.getInputStream(), "UTF-8"));
String line;
while ((line = reader.readLine()) != null) {
data.append(line);
}
System.out.println(data.toString());
}
用这个方法博主测试了很久。终究是达不到想要的结果。这个方案的结果是页面上会提示"Access-Control-Allow-Origin"这个错误(这个是要在服务器做设置的。)但是数据能够正常发送和接收。
AJAX跨域请求解决方案二
之后楼主就在服务器上下手了。页面这边就简简单单的写了这样的一些js
var obj = {};
obj['id']=1;
obj['name'] = "test";
$.ajax({
//url:"http://localhost:8080/TestWebBefore/test",
url:"http://192.168.1.184:9090/HanYiAPP/mine/test",
type:"post",
contentType:'application/json',
dataType:"json",
data:JSON.stringify(obj),
//data:JSON.stringify($("fo").serialize()),
success:function(data){
console.log(data);
},
error:function(data){
console.log(data);
}
});
之后便是在服务器这端做一系列的设置。
首先要解决的是AJAX跨域问题。当然,上面那个方案也能解决跨域问题,但是那样的话需要在客户端开发新的控制器。所以不是博主想要的结果。到此,不在提上述方案了。
度娘了一下AJAX跨域,发现还是有很多的码友在解决这样的事。在此,推荐一篇日志。是有关跨域资源共享的。各大论坛中总是粗略的说一下设置响应头就能解决,但是具体问题具体分析嘛。在SpringMVC种最有效的方式就是写一个filter来处理响应。核心代码如下:
HttpServletResponse rep = (HttpServletResponse)response;
rep.addHeader("Access-Control-Allow-Origin", "");
rep.addHeader("Access-Control-Allow-Methods", "POST,GET");
rep.addHeader("Access-Control-Allow-Credentials", "true");
rep.addHeader("Access-Control-Allow-Headers", "Origin, No-Cache, X-Requested-With, If-Modified-Since, Pragma, Last-Modified, Cache-Control, Expires, Content-Type, X-E4M-With");
chain.doFilter(request, response);
为什么要推荐那一篇日志呢。因为上述方法中涉及的参数在日志中已经有了很好的解释和说明。
Access-Control-Allow-Origin这个字段是必须的。值为代表着允许任何域访问。多个域的话可以用空格隔开(具体没有测试)
Access-Control-Allow-Methods这个字段是必须的。值为请求类型名。
Access-Control-Allow-Credentials该字段可选。它的值是一个布尔值,表示是否允许发送Cookie。默认情况下,
Cookie不包括在CORS请求之中。设为true,即表示服务器明确许可,Cookie可以
包含在请求中,一起发给服务器。这个值也只能设为true,如果服务器不要浏
览器发送Cookie,删除该字段即可。
Access-Control-Expose-Headers该字段可选。跨域请求时,XMLHttpRequest对象的getResponseHeader()方法只能拿到6个
基本字段:Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma。
如果想拿到其他字段,就必须在Access-Control-Expose-Headers里面指定。上面的例子指定,getResponseHeader('FooBar')可以返回FooBar字段的值。
上述解释来自日志跨域资源共享。
这样一来,就AJAX可以发送跨域请求了。
AJAX跨域请求解决方案三
$.getJSON("http://URL?jsoncallback=?",JSON.stringify(obj),function(json){console.log(json);});
上述方式只能作用于GET请求
大概就有这样的几种方式来解决AJAX跨域问题。如果还有别的方案也可以一起交流哦
有关Ajax跨域请求的解决方案的更多相关文章
- [转载]JQuery的Ajax跨域请求的解决方案
今天在项目中需要做远程数据加载并渲染页面,直到开发阶段才意识到ajax跨域请求的问题,隐约记得Jquery有提过一个ajax跨域请求的解决方式,于是即刻翻出Jquery的API出来研究,发现JQuer ...
- ajax跨域请求的解决方案
一直打算改造一下自己传统做网站的形式. 我是.Net程序员,含辛茹苦数年也没混出个什么名堂. 最近微信比较火, 由于现在大环境的影响和以前工作的总结和经验,我打算自己写一个数据,UI松耦合的比较新潮的 ...
- JQuery的Ajax跨域请求的解决方案
客户端调用代码示例: var myurl = "http://js.yingdoo.com/embed/CAPTCHA.ashx?m=" + phone_val + "& ...
- ajax跨域请求解决方案
大家好,今天我们学习了js的跨域请求的解决方案,由于JS中存在同源策略,当请求不同协议名,不同端口号.不同主机名下面的文件时,将会违背同源策略,无法请求成功!需要进行跨域处理! 方案一.后台PHP进行 ...
- JQuery的Ajax跨域请求原理概述及实例
今天在项目中需要做远程数据加载并渲染页面,直到开发阶段才意识到ajax跨域请求的问题,隐约记得Jquery有提过一个ajax跨域请求的解决方式,于是即刻翻出Jquery的API出来研究,发 JQuer ...
- jquery ajax跨域请求详解
本文章来给大家详细jquery中的ajax跨域请求, 在JQuery对于Ajax的跨域请求有两类解决方案,不过都是只支持get方式.分别是JQuery的jquery.ajax jsonp格式和jque ...
- 第四节:跨域请求的解决方案和WebApi特有的处理方式
一. 简介 前言: 跨域问题发生在Javascript发起Ajax调用,其根本原因是因为浏览器对于这种请求,所给予的权限是较低的,通常只允许调用本域中的资源, 除非目标服务器明确地告知它允许跨域调用. ...
- JAVAEE——宜立方商城11:sso登录注册功能实现、通过token获得用户信息、Ajax跨域请求(jsonp)
1. 学习计划 第十一天: 1.sso注册功能实现 2.sso登录功能实现 3.通过token获得用户信息 4.Ajax跨域请求(jsonp) 2. Sso系统工程搭建 需要创建一个sso服务工程,可 ...
- ajax 跨域访问的解决方案
ajax 跨域访问的解决方案 一.什么是跨域: 1.什么样的请求属于跨域: 域名,端口有任何一个不相同都属于跨域: 二.跨域的常用几种解决方案: 1.jsonp: 2.iframe: 3.webcon ...
随机推荐
- 【python】python的正则表达式 re
ps:本文摘自互联网,觉得结构很好,讲的也很清晰.记下,备查. 延伸阅读:python的 内建函数 和 subprocess .此文是本系列的第三篇文章了,和之前一样,内容出自官方文档,但是会有自己的 ...
- http2.4简单配置
前言: 上一篇博文说到了http的发展以及http完整请求响应的工作流程. 一.开篇: 从最简单的静态服务器开始. 之前说过,http是应用层协议,必定会在用户空间体现出具体的应用程序.常见的http ...
- 使用mysql5.7新特性(虚拟列)解决使用前通配符性能问题
众所周知,在mysql里的后通配符可以使用索引查找,前通配查询却无法使用到索引,即使是使用到了索引,也是使用了索引全扫描,效率依然不高,再MySQL5.7之前,一直都没有好的办法解决,但是到了MySQ ...
- Python argparse模块实现模拟 linux 的ls命令
python 模拟linux的 ls 命令 sample: python custom_ls.py -alh c:/ 选项: -a ,--all 显示所有文件,包括'.'开头的隐藏文件 -l 列表显 ...
- 了解python,利用python来制作日常猜拳,猜价小游戏
初次接触python,便被它简洁优美的语言所吸引,正所谓人生苦短,python当歌.python之所以在最近几年越发的炽手可热,离不开它的一些特点: 1.易于学习:Python有相对较少的关键字,结构 ...
- 自定义控件,上图下字的Button,图片任意指定大小
最近处在安卓培训期,把自己的所学写成博客和大家分享一下,今天学的是这个自定义控件,上图下字的Button安卓自带,但是苦于无法设置图片大小(可以在代码修改),今天自己做了一个,首先看一下效果图,比较实 ...
- head first python菜鸟学习笔记(第七章) ——web应用之为数据建模
问题1. #意思是从athletelist.py中导入AthleteListfrom athletelist import AthleteList 源程序代码 import pickle from a ...
- 网络分析法(Analytic Network Process,ANP)
什么是网络分析法 网络分析法(ANP)是美国匹兹堡大学的T.L.Saaty教授于1996年提出的一种适应非独立的递阶层次结构的决策方法,它是在层次分析法(Analytic Hierarchy Proc ...
- Go基础之--位操作中你所不知道的用法
之前一直忽略的就是所有语言中关于位操作,觉得用处并不多,可能用到也非常简单的用法,但是其实一直忽略的是它们的用处还是非常大的,下面先回顾一下位操作符的基础 位操作符 与操作:&1 & ...
- 使用JSCH框架通过跳转机访问其他节点
之前搞了套远程访问ssh进行操作的代码,最近有需求,需要通过一台跳转机才能访问目标服务.在网上搜了半天,也没找到比较好的例子,就自己翻阅了下JSCH的API.但是看的云里雾里的.联想了下,端口转发的原 ...