二级域名间相互请求 ajax跨域请求
写这篇是为了记录自己花周末搜啊搜,试啊试解决的ajax跨域请求的问题。幸苦了,痛并快乐着。
首先介绍下我的需求:
配置:服务端只有一个Tomcat服务器,Web项目没有用Spring等框架,完全是纯手写Servlet。
项目路径:项目根路径webApps\mainproject,mainproject下有hello文件夹。
域名:主域名myname.com,默认主页是www.myname.com,映射到mainproject\index.jsp,项目中的Servlet等都是该域名下,完成后一切都顺利运行。
然后我想弄一个二级域名hello.myname.com,映射到mainproject\hello\index.jsp。
(如何增加二级域名看这里,如何配置二级域名看这里)
此时,我完成了www.myname.com和hello.myname.com的访问,但是当我正得意时,在hello域名下请求Servlet时提示404找不到,wtf,看了半天才发现请求的url变成了hello.myname.com/Servlet,这要是能请求到那就见鬼了,我的Servlet都是主域名下的,路径不同,肯定访问不到,一想如果直接把url设置成www.myname.com/Servlet不就好了,然后我还是太年轻,报错了,然后就找啊找啊找啊,最后才定位是跨域访问的问题(亏我搜了那么久就没有一个关键字是跨域,所以我才在标题加上二级域名字眼)。好了。废话不多说直接上代码。
再废话一句,想了解跨域是什么的看这里,不想看的直接跳过,或者看完自己项目还有问题的就回来看看我的解决方法。
这是我的ajax请求,这是hello.myname.com主页hello\index.jsp的js请求代码,请求www.myname.com下的CheckServlet。网上很多都说只能用GET不能用POST,但我试了,POST也可以,但是GET肯定可以,dataType必须是jsonp,这个没得说,不理解的看上面跨域的链接
function submit(){ var myName = $("#my_name").val();var yourName = $("#your_name").val();$.ajax({ //跨域请求必须是jsopdataType: 'jsonp',//请求方式type:'POST',//可以自定义,服务端用于接收callback调用的function名的参数,默认是callback//jsonp : "jsonpCallback"url:'http://www.myname.com/CheckServlet',data:{my_name:myName,your_name:yourName}, success: function(data){var code = data["code"];if("1" == code){window.location.href="www.baidu.com";}else{alert("error "+code);} } ,error:function(){alert("error"); }});}
js端这样设置就可以了,需要注意的是跨域请求过来的data是json(现在想想是不是可以直接拼字符串,有空试试)。如果你仔细看浏览器的请求就会发现url后面有个callback(不明白callback是什么的可以看上面的跨域链接)
以下是CheckServlet的代码
public class CheckServlet extends HttpServlet {private static final long serialVersionUID = 1L;/*** @see HttpServlet#HttpServlet()*/public CheckServlet() {super();// TODO Auto-generated constructor stub}/*** @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)*/protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//以下是关键代码,设置允许跨域访问//允许所有来源访问response.setHeader("Access-Control-Allow-Origin", "*");//允许访问的方式response.setHeader("Access-Control-Allow-Methods", "POST, GET");response.setContentType("text/html;charset=UTF-8");//callback是跨域请求的时候生成的,可以自己定义String callback = request.getParameter("callback");PrintWriter out = response.getWriter();String mName = request.getParameter("my_name");String youName = request.getParameter("your_name");String code;if(checkName(mName, youName)){code = "1";}else{code = "0";}String outString = "{\"code\":\""+code+"\"}";//必须要用callback +(返回内容)out.write(callback+"("+outString+")");}private boolean checkName(String myName, String yourName) {//do your logic}/*** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)*/protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubdoGet(request, response);}}
主要是设置response
//允许所有来源访问
response.setHeader("Access-Control-Allow-Origin", "*");
//允许访问的方式
response.setHeader("Access-Control-Allow-Methods", "POST, GET");
还有数据返回的时候要要用callback拼接(很多博客只介绍了ajax和response设置,导致我没有拼接callbak,每次请求都是error,在此感谢这位博主)
主要三点:
1.ajax请求设置
2.servlet的response设置
3.用callback进行返回值的拼接
好了,到此就就可以开心的玩了。
其实对于二级域名来说我这用的太麻烦,因为hello是在mainproject下,所以如果www.myname.com进入hello路径进行请求的话要么直接使用hello域名要么就重新适配,我为了方便直接将hello.myname.com指向mainproject\hello下了,但最后还是不太方便。
最简单的就是webApps下放多个项目,一个二级域名对应一个项目,这样就避免我上面的嵌套问题,各维护各的,要想访问直接用域名访问。
这就是这两天的成果,完成ajax跨域,以后还是学习用框架吧。
二级域名间相互请求 ajax跨域请求相关推荐
- js请求结果拦截机器_js利用jquery的jsonp来解决ajax跨域请求被浏览器拦截结果的问题...
先来个表.页面太多对不起我也不知道这张表是从哪个博客保存过来的,所以无法注明博客地址.非常抱歉.URL说明是否允许通信 http://www.a.com/a.jshttp://www.a.com/b. ...
- JSONP实现Ajax跨域请求
前言 由于浏览器存在同源策略的机制,所谓同源策略就是阻止从一个源(域名,包括同一个根域名下的不同二级域名)加载的文档或者脚本获取/或者设置另一个源加载的文档属性. 但比较特别的是:由于同源策略是浏览器 ...
- 第114天:Ajax跨域请求解决方法(二)
一.什么是跨域 我们先回顾一下域名地址的组成: http:// www . google : 8080 / script/jquery.js http:// (协议号) www (子 ...
- Ajax 跨域请求详解
问题描述: 实际开发中,我们经常会看到这样的错误提示: XMLHttpRequest cannot load http://-- No 'Access-Control-Allow-Origin' he ...
- ajax跨域请求Jsonp实现,使用jsonp实现ajax跨域请求
Jsonp(JSON with Padding)是资料格式 json 的一种"使用模式",可以让网页从别的网域获取资料. 由于同源策略,一般来说位于 server1.example ...
- AJAX跨域请求数据原理与案例
1.如何通过AJAX跨域请求数据 AJAX通过jsonp来实现跨域请求数据,通过设置dataType(jquery)为jsonp即可. 2.AJAX如何通过jsonp实现跨域(来源于其他网站资料) J ...
- ajax跨域请求原理,Ajax跨域请求的原理(图文教程)
这篇文章主要为大家详细介绍了Ajax跨域请求的原理,Ajax怎么样做跨域请求?具有一定的参考价值,感兴趣的小伙伴们可以参考一下 本文实例为大家分享了Ajax跨域请求的具体实现过程,供大家参考,具体内容 ...
- 服务端配置实现AJAX跨域请求
2019独角兽企业重金招聘Python工程师标准>>> 一直以为AJAX跨域是无法逾越的鸿沟,最近发现原来在服务端可以通过发送header信息来允许AJAX跨域请求. PHP代码示例 ...
- Ajax跨域请求与解决方案
同域与跨域请求 同域请求: 网络协议, 域名,端口号都一致,则为同域(同源)请求 http://www.sina.com.cn:8090/index.html 跨域请求: 浏览器对于javascrip ...
- Ajax跨域请求以及乱码解决
Ajax跨域请求2种解决方法 1 ) 什么叫跨域请求,协议,域名,端口号,其中一样不同都称跨域; 第一种:使用script标签发送请求; //创建一个script标签; var v_element=d ...
最新文章
- firefox下的调试工具
- MFC Dll的详细介绍及创建
- Angular--TypeScript finalize 方法
- 系统重装后 Endnote 不能和Word联用的解决方法
- android判断和创建快捷方式(4.03测试通过)
- wpf中UserControl制作
- javascript 代码段整理
- 21天通关python 磁力_Python 实现 BT 种子转化为磁力链接 [实战]
- 硬盘保修查询网站明细清单希捷硬盘保修查询西数硬盘保修查
- 锐捷 linux 网卡信息失败,linux折腾日记:校园网锐捷上网设置
- html 整体架构框架 源码,上 中 下结构网页模板布局框架代码
- 人工智能在药物不良反应预测中的应用
- 拓嘉辰丰:影响拼多多直通车推广效果的因素有哪些?
- javaSE探赜索隐五<异常>
- JSP九大内置对象:
- 电脑怎么用计算机打开指令,快速打开电脑上的计算器
- Python安装torch模块报错处理
- 树莓派ASP.NET环境配置
- ASP.NET 缓存技术(一)——启用页面输出缓存
- 2017年原生广告程序化购买将成为新趋势