本地HTML访问REST服务的实现
本地HTML访问REST服务的实现
1 前言
最近一段时间在研究如何实现跨平台应用,其中的一个关键技术点就是本地HTML页面如何访问远程服务。经过探索,终于解决了碰到的各种问题,做出了一个Demo.
本文就Demo所用的技术架构做了一个简介,并分析了实现中碰到的问题及相应的解决方法。一来以此作为这段时间工作的一个技术总结,二来希望能对其他同行有所帮助。
2 技术架构
Demo 本身的功能很简单,
1) 本地HTML 发出 “POST” 命令,发送一段数据到 Server端
2) Server 端存储收到的数据
3) 本地HTML 发出工“GET” 命令,取回数据
Demo分为两部分。Client端比较简单,就是HTML+JQuery. Server端则用REST服务, 是用JAVA写的,具体方案是glasshfish+ Jersey. 两者这间用Json格式通信。
3 主要问题的解决方法:
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
<servlet>
<servlet-name>ServletAdaptor</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name>
<param-value>jasontesting.ResponseCorsFilter</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
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端源代码如下。
<script src="jquery-latest.js"></script>
<script src="jquery.json-2.3.js"></script>
<script type="text/javascript">
var url= "http://localhost:8080/WebApplication3/resources/contact";
var postobject={id:2,name:"Bob9",addresses:[{street:"Long Street 1",town:"Short Village"}],id_attribute:888};
jQuery.ajax({
url: url,
type: "POST",
data: $.toJSON(postobject),
dataType: "json",
contentType:"application/json",
success: function(result) {
//Write your code here
//alert(result);
$.get(
url,
function(data, textStatus, jqXHR) {
alert(data);
},
"json"
);
}
});
</script>
3.2 Accept and Content-Type Header
这个问题本身并不复杂,但由于之前对HTTP协议并不十分了解,还是花了大半天时间。问题核心是要在Request中要加入 Accept 与 Content-Type Header,指定可接爱的和发送的MIME 类型。具体的解决例子可参考Browser端的代码。
4 总结
经过这些天的摸索,终于做出这个Demo,弄清楚了本地HTML访问REST服务可如何实现,心中很是欣慰。要继续努力,深化在移动开发方面的技术积累。
5 参考
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
本地HTML访问REST服务的实现相关推荐
- Vsftpd文件传输服务(本地用户访问)
本地用户访问: 本地用户模式是通过linux系统本地的账户信息进行认证的模式,相对于匿名模式更安全,更简单,用户登陆FTP服务器后,将默认位于自己的宿主目录中,且在宿主目录中拥有读写权限. 部署环境: ...
- win10系统启动本地tomcat或者jetty服务,域内其他电脑访问本地服务端口8080,无法访问
win10系统启动本地tomcat或者jetty服务,域内其他电脑访问本地服务端口8080,无法访问 域内其他电脑访问不了本地服务,是因为本地防火墙拦截造成的. 主要解决办法 直接关闭防火墙.(控制面 ...
- 多样化实现Windows Phone 7本地数据访问3——DB4O
终于把这篇文章发出来了. 对于Windows Phone 7 Visit Local DataBase新采用DB4O和SiaqoDB方式来验证 本地数据访问. 其实这篇已经在上周 完成一个大概草稿. ...
- 从Kubernetes安全地访问AWS服务,告诉你多云场景下如何管理云凭据!
作者| Alexey Ledenev 翻译 | 天道酬勤,责编 | Carol 出品 | CSDN云计算(ID:CSDNcloud) 随着企业与各种云提供商合作,多云场景已经变得十分常见. 在谷歌Ku ...
- 转载:迷你云 – 搭建自己的本地多人团队Dropbox 服务
迷你云 – 搭建自己的本地多人团队Dropbox 服务 本站此前曾介绍过许多 Dropbox 及其衍生和类似服务,均属于公有云范畴.随着国内类 Dropbox 项目竞争格局的变化和加速洗牌,技术团队创 ...
- 尝试从远程计算机访问Web服务不显示调用按钮
当尝试从远程计算机访问 Web 服务时,不会显示"调用"按钮.并且会收到以下错误信息: The test form is only available for requests f ...
- 搭建阿里云Linux版服务器+使用docker安装EMQ、Node-RED、MySQL+本地Navicat访问数据库(增删改查)——详细流程
搭建阿里云Linux版服务器+使用docker安装EMQ.Node-RED.MySQL+本地Navicat访问数据库 云服务器基础搭建 注册云服务器 XShell简介 部署EMQ 部署docker 物 ...
- Apache本地localhost访问正常通过IP访问提示You dont have permission to access
Apache本地localhost访问正常通过IP访问提示You don't have permission to access 环境: win2012 wampserver3.2.0_x64 安装完 ...
- 如何在Android上访问iCloud服务
Apple users are able to store their notes, pictures, contacts, and settings in their iCloud storage ...
最新文章
- python选课系统_【精选】在Monash读Data Science,人人都拥有这样一份选课指南。
- java web 图书管理系统_图书管理系统,源代码 Java初级小项目
- python 数字证书模拟登录_用于生成WebService使用的数字证书及签署证书.python脚本...
- python django 表单_Django ModelForm与Form
- linux多级反馈队列的实现,多级反馈队列调度算法的实现
- mikadonic-RHCE——NFS服务配置图解
- Form partner relationships early, even if informal
- 时间序列深度学习:状态 LSTM 模型预测太阳黑子(下)
- 利用Excel制作库房管理系统
- 第九届蓝桥杯 明码(三种方法)
- win10 2016 长期服务版激活
- python中inf_认识python中的inf和nan
- 机器学习实战(Machine Learning in Action)学习笔记————08.使用FPgrowth算法来高效发现频繁项集...
- matlab 画图直接存储_Matlab用plot画图后怎么保存图像
- JVM结构和JVM的架构模型以及JAVA生命周期介绍
- android 自定义textview在onlayout中设置setTypeface的时候报错 requestLayout() improperly called by ...
- WPS新建文字分享微信.docx形式_高效神器:花 5 分钟输入文字,就能自动变成 PPT...
- Apache Hudi调研小记
- 柿饼UI入门课程第一周作业
- 这十个时间千万别受孕
热门文章
- 音乐相册(程序员表白必备,或者生日礼物)(小白学习向)
- 深信服服务器装系统,深信服新上网行为管理系统安装调试手册..doc
- android 百度地图线路规划问题
- java 队列已满_JAVA中常见的阻塞队列详解
- MuMu模拟器网络连接异常如何处理?
- Gephi中的统计算法学习
- MS-SQL Server 基础类 - SQL语句
- JMeter —— Jar包性能测试 完整流程教学
- Note For Linux By Jes(4)-文件的压缩与打包
- linux关闭内存插槽,linux 统管理中的查看内存插槽数、最大容量和频率