本地html访问rest服务的实现 -凯发k8官方网
本地html访问rest服务的实现
最近一段时间在研究如何实现跨平台应用,其中的一个关键技术点就是本地html页面如何访问远程服务。经过探索,终于解决了碰到的各种问题,做出了一个demo.
本文就demo所用的技术架构做了一个简介,并分析了实现中碰到的问题及相应的解决方法。一来以此作为这段时间工作的一个技术总结,二来希望能对其他同行有所帮助。
demo 本身的功能很简单,
1) 本地html 发出 “post” 命令,发送一段数据到 server端
2) server 端存储收到的数据
3) 本地html 发出工“get” 命令,取回数据
demo分为两部分。client端比较简单,就是html jquery. server端则用rest服务, 是用java写的,具体方案是glasshfish jersey. 两者这间用json格式通信。
3.1 same origin policy
3.1.1 问题
这是整个demo中耗时最多的一个问题。问题的表象是 从chrome发出http命令后,chrome console中报 “origin null is not allowed by access-control-allow-origin”错误。
这是由于browser的same origin policy 限制的缘故。简单来说,从html中发出xmlhttprequest 请求时,browser会做检查,如果发现response中没有access-control-allow-origin header或access-control-allow-origin header header的值与 html的 orgin 不同时,browser会拒接绝该response,javascript就收不到该response。 本地html的origin是 null, 而server端没有发出access-control-allow-origin header header给browser, 所以会有了“origin null is not allowed by access-control-allow-origin”错误。
3.1.2 解决方法
事实上有一个w3c标准,cross origin resource sharing (cors) 专门用来解决这个问题的。目前的主流browser也有支持。cors 在http message 加入几个header, browser和 server可以利用这些header来判断对方是否是安全,是否可以通信。
具体来说,cors包括两方面。 server端和browser端。
3.1.2.1 server端
以demo中的server端为例,解决方法就是在 jersey servlet中加入一个filter, 在 filter中修改给browser的response, 共有两步
1) 配置web.xml
在jersey servlet中加入init-param
2) responsecorsfilter
/*
* to change this template, choose tools | templates
* and open the template in the editor.
*/
package jasontesting;
/**
*
* @author jianl
*/
import javax.ws.rs.core.response;
import javax.ws.rs.core.response.responsebuilder;
import com.sun.jersey.spi.container.containerrequest;
import com.sun.jersey.spi.container.containerresponse;
import com.sun.jersey.spi.container.containerresponsefilter;
public class responsecorsfilter implements containerresponsefilter {
@override
public containerresponse filter(containerrequest req, containerresponse contresp) {
responsebuilder resp = response.fromresponse(contresp.getresponse());
resp.header("access-control-allow-origin", "*")
.header("access-control-max-age", 1728000)
.header("access-control-allow-methods", "get, post, options");
string reqhead = req.getheadervalue("access-control-request-headers");
if(null != reqhead && !reqhead.equals(null)){
resp.header("access-control-allow-headers", reqhead);
}
contresp.setresponse(resp.build());
return contresp;
}
}
3.1.2.2 browser端
如前所述,browser已经实现了cors,cors对应用开发人员是透明的。为了方便,公布demo的browser端源代码如下。
3.2 accept and content-type header
这个问题本身并不复杂,但由于之前对http协议并不十分了解,还是花了大半天时间。问题核心是要在request中要加入 accept 与 content-type header,指定可接爱的和发送的mime 类型。具体的解决例子可参考browser端的代码。
经过这些天的摸索,终于做出这个demo,弄清楚了本地html访问rest服务可如何实现,心中很是欣慰。要继续努力,深化在移动开发方面的技术积累。
http://www.nczonline.net/blog/2010/05/25/cross-domain-ajax-with-cross-origin-resource-sharing/
http://www.html5rocks.com/en/tutorials/cors/
http://blog.usul.org/cors-compliant-rest-api-with-jersey-and-containerresponsefilter/
转载于:https://www.cnblogs.com/levinj/archive/2012/04/09/2439670.html
总结
以上是凯发k8官方网为你收集整理的本地html访问rest服务的实现的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇:
- 下一篇: