巧妙利用JQuery和Servlet来实现跨域请求
在网上看到很多的JQuery跨域请求的文章,比较有意思。这里我发表一个Servlet与JQuery配置实现跨域的代码,供大家参考。不足之处请指教
原理:JavaScript的Ajax不可以跨域,但是可以通过向本地的一个Servlet发出请求,由Servlet完成跨域。再把远程的结构返回给客户端。这样Ajax就可以跨域了。在后面,再发一个PHP版本的,请大家关注啊。下面是代码
JS代码:
注意:在Post方式时,param1和param2为向远程发送的参数值,可以有多个。
|
1
2
3
4
5
6
7
8
9
10
11
12
|
//GET方式function reqeustCrossDomainProxyGet(){ var param = {'requesturl':url,'typedata':'JSON'}; var data = getCrossDomainProxyRemote(param,"json");}//Post方式function reqeustCrossDomainProxyPost(param1,param2){ var url = apiServer+"/api/lucene/query"; var param = {'requesturl':url,'typedata':'JSON','param1':param1,'param2':param2}; var data = getCrossDomainProxyRemote(param,"json");} |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
/** * JS向本址的一个Servlet发送POST请求,所有关于远程请求的参数。 * 在此处参POST方式发送给Servlet * @param param 远程请求参数 * @param rtype JS返回类型(暂时没有用到) * @return */function getCrossDomainProxyRemote(param,rtype){ var url = "/cross/proxy";//Servlet的URL地址 var returndata; $.ajax({ url: url,type: 'POST',dataType: rtype,timeout: 40000,data:param, async:false, error: function(response,error) {alert(response.status);}, success: function(data){returndata=data;} }); return returndata;} |
Java代码:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
public class CorssDomainProxy extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doPost(req, resp); } public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { boolean requestType = false;//标记远程请求类型,默认为GET方式 PrintWriter out = resp.getWriter(); Enumeration keys = req.getParameterNames();//取出客户端传入的所有参数名 ArrayList<String> params = new ArrayList<String>(); String url=null; while (keys.hasMoreElements()){ String key = (String) keys.nextElement(); /** * 如果请求参数内有如下几种表示,这此参数不参与远程请求 */ if(key.equals("requesturl")){//判断参数是否是,远程请求地址 url = req.getParameter(key); }else if(key.equals("typedata")){//判断请求数据类型,暂时没有用到 }else if(key.equals("returntype")){//判断请求返回类型,暂时没有用到 }else{ params.add(key);//其它加入参数列表,此处为参与远程请求的参数 requestType = true;//修改标记,表求远程请求为POST方式 } } HttpClient client = new HttpClient(); HttpMethod method = null; if(requestType){//判断请求方式,并实例化HttpMethod对象,true:POST,false:GET method = new UTF8PostMethod(url); for(String name : params){//迭代POST参数,加入到请求中 String _value = req.getParameter(name); ((PostMethod)method).setParameter(name,_value); } }else{ method = new GetMethod(url); } client.executeMethod(method);//执行请求 String bodystr = method.getResponseBodyAsString();//返回结果 out.println(bodystr);//将结果返回给客户端 } /** * 内部类,转换URL字符串为UTF-8 * @author Administrator * */ private static class UTF8PostMethod extends PostMethod { public UTF8PostMethod(String url) { super(url); } @Override public String getRequestCharSet() { return "UTF-8"; } } } |
巧妙利用JQuery和Servlet来实现跨域请求的更多相关文章
- JQuery和Servlet来实现跨域请求
在网上看到很多的JQuery跨域请求的文章,比较有意思.这里我发表一个Servlet与JQuery配置实现跨域的代码,供大家参考.不足之处请指教 原理:JavaScript的Ajax不可以跨域,但是可 ...
- 关于试用jquery的jsonp实现ajax跨域请求数据的问题
我们在开发过程中遇到要获取另一个系统数据时,就造成跨域问题,这就是下文要说的解决办法: 先我们熟悉下json和jsonp的区别: 使用AJAX就会不可避免的面临两个问题,第一个是AJAX以何种格式来交 ...
- 浅谈linux 下,利用Nginx服务器代理实现ajax跨域请求。
ajax跨域请求对于前端开发者几乎在任何一个项目中都会用到,众所周知,跨域请求有三种方式: jsonp; XHR2 代理: jsonp: 这种应该是开发中是使用的最多的,最常见的跨域请求方法,其实aj ...
- 利用Nginx轻松实现Ajax的跨域请求(前后端分离开发调试必备神技)
利用Nginx轻松实现浏览器中Ajax的跨域请求(前后端分离开发调试必备神技) 前言 为什么会出现跨域? 造成跨域问题的原因是因为浏览器受到同源策略的限制,也就是说js只能访问和操作自己域下的资源,不 ...
- jQuery Ajax 简单的实现跨域请求
html 代码清单: <script type="text/javascript" src="http://www.youxiaju.com/js/jquery-1 ...
- jQuery的jsop,jsonp跨域请求
https://www.cnblogs.com/chiangchou/p/jsonp.html
- jquery中$.get()如何让跨域请求携带cookie?
在这个get请求前面加上这个就好了~~~~
- jQuery jsonp跨域请求
跨域的安全限制都是对浏览器端来说的,服务器端是不存在跨域安全限制的. 浏览器的同源策略限制从一个源加载的文档或脚本与来自另一个源的资源进行交互. 如果协议,端口和主机对于两个页面是相同的,则两个页面具 ...
- jquery Ajax跨域请求
这是jquery api文档对跨域请求的解析:如果获取的数据文件存放在远程服务器上(域名不同,也就是跨域获取数据),则需要使用JSONP类型.使用这种类型的话,会创建一个查询字符串参数 callbac ...
随机推荐
- 第九章 Mysql函数
简介 数学函数:处理数字 字符串函数:处理字符串 日期和时间函数:处理日期和时间,获取时间 条件判断函数:控制条件选择 系统信息函数:获取MySQL系统信息,包括数据库名称,当前用户名和数据库版本 加 ...
- 【第二周】关于java.util包下的Random类
1.功能:此类的实例用于生成伪随机数流 2.方法(Random的方法有很多,在此只解释说明我认为比较常用的几个方法) (1)next(int bits):生成下一个伪随机数 (2)nextDouble ...
- 【Leetcode】445. Add Two Numbers II
You are given two non-empty linked lists representing two non-negative integers. The most significan ...
- HDU4747——2013 ACM/ICPC Asia Regional Hangzhou Online
啦啦啦. 这是杭州网赛的一个题目,当时没做出来,当然这个想法确实比较难想到. 题目质量很高,这个题目也很特别,以前都没做过类似的题目.让我又一次体验了线段树的强大力量. 题目的意思是给你n个数a1-a ...
- el表达式作用域查找顺序 注意:当属性名字相同时候 先找到是小的作用域 因为是从小到大开始找的
- 51nod-1220-约数之和
题意 求 \[ \sum _{i=1}^n\sum _{j=1}^nd(ij) \\ d(x)=\sum _{e|x}e \] \(n\le 10^9\) . 分析 没有推出来.这题有几个要点要学习. ...
- bzoj5090[lydsy11月赛]组题
裸的01分数规划,二分答案,没了. #include<cstdio> #include<algorithm> using namespace std; const int ma ...
- Ubuntu 18.04开发环境部署流程
部署流程 安装系统 安装Eclipse和jre 配置系统 安装辅助工具 安装系统 用安装盘安装即可. 一般boot 1G,swap按内存大小,home 20G,根剩余. 安装Eclipse和jre 解 ...
- CF530D sum in the tree
我是题面.原题地址 很简单的一道贪心题 首先,先想想怎么判断是否合法 题目中说,a是自然数,那么子节点的s明显是不能比父节点大的,如果比父节点大,不合法! 所有深度为偶数的点的s被删除了,也只有深度为 ...
- Django基于正则表达式的URL(1)
1. 此时,用户只能看到列表,如果用户想查看详细信息,应该再增加程序. 2. 把信息用a标签包起来以后,详细信息就有了可以跳转的功能. . 3. 点击不同的用户名时,获取到不同的信息. 3.1 在ur ...