本地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服务的实现相关推荐

  1. Vsftpd文件传输服务(本地用户访问)

    本地用户访问: 本地用户模式是通过linux系统本地的账户信息进行认证的模式,相对于匿名模式更安全,更简单,用户登陆FTP服务器后,将默认位于自己的宿主目录中,且在宿主目录中拥有读写权限. 部署环境: ...

  2. win10系统启动本地tomcat或者jetty服务,域内其他电脑访问本地服务端口8080,无法访问

    win10系统启动本地tomcat或者jetty服务,域内其他电脑访问本地服务端口8080,无法访问 域内其他电脑访问不了本地服务,是因为本地防火墙拦截造成的. 主要解决办法 直接关闭防火墙.(控制面 ...

  3. 多样化实现Windows Phone 7本地数据访问3——DB4O

    终于把这篇文章发出来了. 对于Windows Phone 7 Visit Local DataBase新采用DB4O和SiaqoDB方式来验证 本地数据访问. 其实这篇已经在上周 完成一个大概草稿. ...

  4. 从Kubernetes安全地访问AWS服务,告诉你多云场景下如何管理云凭据!

    作者| Alexey Ledenev 翻译 | 天道酬勤,责编 | Carol 出品 | CSDN云计算(ID:CSDNcloud) 随着企业与各种云提供商合作,多云场景已经变得十分常见. 在谷歌Ku ...

  5. 转载:迷你云 – 搭建自己的本地多人团队Dropbox 服务

    迷你云 – 搭建自己的本地多人团队Dropbox 服务 本站此前曾介绍过许多 Dropbox 及其衍生和类似服务,均属于公有云范畴.随着国内类 Dropbox 项目竞争格局的变化和加速洗牌,技术团队创 ...

  6. 尝试从远程计算机访问Web服务不显示调用按钮

    当尝试从远程计算机访问 Web 服务时,不会显示"调用"按钮.并且会收到以下错误信息: The test form is only available for requests f ...

  7. 搭建阿里云Linux版服务器+使用docker安装EMQ、Node-RED、MySQL+本地Navicat访问数据库(增删改查)——详细流程

    搭建阿里云Linux版服务器+使用docker安装EMQ.Node-RED.MySQL+本地Navicat访问数据库 云服务器基础搭建 注册云服务器 XShell简介 部署EMQ 部署docker 物 ...

  8. Apache本地localhost访问正常通过IP访问提示You dont have permission to access

    Apache本地localhost访问正常通过IP访问提示You don't have permission to access 环境: win2012 wampserver3.2.0_x64 安装完 ...

  9. 如何在Android上访问iCloud服务

    Apple users are able to store their notes, pictures, contacts, and settings in their iCloud storage ...

最新文章

  1. python选课系统_【精选】在Monash读Data Science,人人都拥有这样一份选课指南。
  2. java web 图书管理系统_图书管理系统,源代码 Java初级小项目
  3. python 数字证书模拟登录_用于生成WebService使用的数字证书及签署证书.python脚本...
  4. python django 表单_Django ModelForm与Form
  5. linux多级反馈队列的实现,多级反馈队列调度算法的实现
  6. mikadonic-RHCE——NFS服务配置图解
  7. Form partner relationships early, even if informal
  8. 时间序列深度学习:状态 LSTM 模型预测太阳黑子(下)
  9. 利用Excel制作库房管理系统
  10. 第九届蓝桥杯 明码(三种方法)
  11. win10 2016 长期服务版激活
  12. python中inf_认识python中的inf和nan
  13. 机器学习实战(Machine Learning in Action)学习笔记————08.使用FPgrowth算法来高效发现频繁项集...
  14. matlab 画图直接存储_Matlab用plot画图后怎么保存图像
  15. JVM结构和JVM的架构模型以及JAVA生命周期介绍
  16. android 自定义textview在onlayout中设置setTypeface的时候报错 requestLayout() improperly called by ...
  17. WPS新建文字分享微信.docx形式_高效神器:花 5 分钟输入文字,就能自动变成 PPT...
  18. Apache Hudi调研小记
  19. 柿饼UI入门课程第一周作业
  20. 这十个时间千万别受孕

热门文章

  1. 音乐相册(程序员表白必备,或者生日礼物)(小白学习向)
  2. 深信服服务器装系统,深信服新上网行为管理系统安装调试手册..doc
  3. android 百度地图线路规划问题
  4. java 队列已满_JAVA中常见的阻塞队列详解
  5. MuMu模拟器网络连接异常如何处理?
  6. Gephi中的统计算法学习
  7. MS-SQL Server 基础类 - SQL语句
  8. JMeter —— Jar包性能测试 完整流程教学
  9. Note For Linux By Jes(4)-文件的压缩与打包
  10. linux关闭内存插槽,linux 统管理中的查看内存插槽数、最大容量和频率