写这篇是为了记录自己花周末搜啊搜,试啊试解决的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跨域请求相关推荐

  1. js请求结果拦截机器_js利用jquery的jsonp来解决ajax跨域请求被浏览器拦截结果的问题...

    先来个表.页面太多对不起我也不知道这张表是从哪个博客保存过来的,所以无法注明博客地址.非常抱歉.URL说明是否允许通信 http://www.a.com/a.jshttp://www.a.com/b. ...

  2. JSONP实现Ajax跨域请求

    前言 由于浏览器存在同源策略的机制,所谓同源策略就是阻止从一个源(域名,包括同一个根域名下的不同二级域名)加载的文档或者脚本获取/或者设置另一个源加载的文档属性. 但比较特别的是:由于同源策略是浏览器 ...

  3. 第114天:Ajax跨域请求解决方法(二)

    一.什么是跨域 我们先回顾一下域名地址的组成: http:// www . google : 8080 / script/jquery.js   http:// (协议号)       www  (子 ...

  4. Ajax 跨域请求详解

    问题描述: 实际开发中,我们经常会看到这样的错误提示: XMLHttpRequest cannot load http://-- No 'Access-Control-Allow-Origin' he ...

  5. ajax跨域请求Jsonp实现,使用jsonp实现ajax跨域请求

    Jsonp(JSON with Padding)是资料格式 json 的一种"使用模式",可以让网页从别的网域获取资料. 由于同源策略,一般来说位于 server1.example ...

  6. AJAX跨域请求数据原理与案例

    1.如何通过AJAX跨域请求数据 AJAX通过jsonp来实现跨域请求数据,通过设置dataType(jquery)为jsonp即可. 2.AJAX如何通过jsonp实现跨域(来源于其他网站资料) J ...

  7. ajax跨域请求原理,Ajax跨域请求的原理(图文教程)

    这篇文章主要为大家详细介绍了Ajax跨域请求的原理,Ajax怎么样做跨域请求?具有一定的参考价值,感兴趣的小伙伴们可以参考一下 本文实例为大家分享了Ajax跨域请求的具体实现过程,供大家参考,具体内容 ...

  8. 服务端配置实现AJAX跨域请求

    2019独角兽企业重金招聘Python工程师标准>>> 一直以为AJAX跨域是无法逾越的鸿沟,最近发现原来在服务端可以通过发送header信息来允许AJAX跨域请求. PHP代码示例 ...

  9. Ajax跨域请求与解决方案

    同域与跨域请求 同域请求: 网络协议, 域名,端口号都一致,则为同域(同源)请求 http://www.sina.com.cn:8090/index.html 跨域请求: 浏览器对于javascrip ...

  10. Ajax跨域请求以及乱码解决

    Ajax跨域请求2种解决方法 1 ) 什么叫跨域请求,协议,域名,端口号,其中一样不同都称跨域; 第一种:使用script标签发送请求; //创建一个script标签; var v_element=d ...

最新文章

  1. firefox下的调试工具
  2. MFC Dll的详细介绍及创建
  3. Angular--TypeScript finalize 方法
  4. 系统重装后 Endnote 不能和Word联用的解决方法
  5. android判断和创建快捷方式(4.03测试通过)
  6. wpf中UserControl制作
  7. javascript 代码段整理
  8. 21天通关python 磁力_Python 实现 BT 种子转化为磁力链接 [实战]
  9. 硬盘保修查询网站明细清单希捷硬盘保修查询西数硬盘保修查
  10. 锐捷 linux 网卡信息失败,linux折腾日记:校园网锐捷上网设置
  11. html 整体架构框架 源码,上 中 下结构网页模板布局框架代码
  12. 人工智能在药物不良反应预测中的应用
  13. 拓嘉辰丰:影响拼多多直通车推广效果的因素有哪些?
  14. javaSE探赜索隐五<异常>
  15. JSP九大内置对象:
  16. 电脑怎么用计算机打开指令,快速打开电脑上的计算器
  17. Python安装torch模块报错处理
  18. 树莓派ASP.NET环境配置
  19. ASP.NET 缓存技术(一)——启用页面输出缓存
  20. 2017年原生广告程序化购买将成为新趋势

热门文章

  1. 开源视频服务器软件MJPG-streamer研究
  2. 论文查重检测系统的原理是什么?
  3. 小学计算机网络教室简介,市中小学计算机网络教室(网络学习室)
  4. AI Studio 数据集
  5. 游戏测试流程及工作内容
  6. c语言编写 程序 闰年,C语言计算闰年程序
  7. python用input输入整数列表_python中,用input()输入一个整数
  8. android转场动画的两种方式
  9. 【GIS风暴】什么是EPSG?常见坐标系对应的EPSG代号、经度范围、中央经线是多少?
  10. 利用浏览器书签执行脚本辅助