使用JSONP完成HTTPS跨域请求

疯狂的扣子 2012-04-02

使用JSONP完成HTTPS跨域请求

前提条件

1.已配置本机java环境

2.已安装tomcat6.0

第一步使用HTTPS协议前期准备

进入命令提示符窗口(cmd)输入以下命令

1.为服务器生成安全证书

命令:

Keytool-genkey-v-aliastomcat-keyalgRSA-keystoreserver.keystore

输入新密码:123456

您的名字与姓氏是什么?

[Unknown]:这里填写服务器所在的域名(如:www.baidu.com本机为localhost)

您的组织单位名称是什么?

[Unknown]:ysb

您的组织名称是什么?

[Unknown]:portal

您所在的城市或区域名称是什么?

[Unknown]:nj

您所在的州或省份名称是什么?

[Unknown]:js

该单位的两字母国家代码是什么

[Unknown]:en

N=localhost,OU=ysb,O=portal,L=js,ST=nj,C=en正确吗?

[否]:如果跟你填写的信息一致则输入“Y“反之则为“N”。

说明:tomcat:别名

RSA:使用的加密方式

server.keystore:生成的服务器证书名(必须以’.keystore’为后缀名)

注意:这样服务器证书就生成了如果使用单向认证,那么下面生成客户端证书的步骤就不用了。如果使用单向认证下面2,3,4步就不用了。

2.为客户端生成安全证书

命令:

Keytool-genkey-v-aliasmykey-keyalgRSA-storetypePKCS12-keystoreclient.p12

输入keystore密码:设置密码如:123456

再次输入新密码:123456

您的名字与姓氏是什么?

[Unknown]:localhost

您的组织单位名称是什么?

[Unknown]:ysb

您的组织名称是什么?

[Unknown]:ysb

您所在的城市或区域名称是什么?

[Unknown]:nj

您所在的州或省份名称是什么?

[Unknown]:js

该单位的两字母国家代码是什么

[Unknown]:en

CN=localhost,OU=ysb,O=ysb,L=nj,ST=js,C=en正确吗?

[否]:如果跟你填写的信息一致则输入“Y“反之则为“N”。

说明:mykey:别名

PKCS12:以PKCS121格式生成文件

client.p12:生成的客户端证书文件

localhost:这里填本地IP或者localhost

3.将证书导出到证书文件。

命令:

Keytool-export-v-aliasmykey-keystoreclient.p12-storetypePKCS12-storepasspassword-rfc-fileclient.cer

说明:password:为客户端生成证书的证书密码。

client.cer:导出后缀名为‘.cer’的证书文件(方便将客户端证书导入到服务器添加信任)

4.通过以上命令,客户端证书就被我们导出到“client.cer”文件了。下一步,是将该文件导入到服务器的证书库,添加为一个信任证书:

Keytoolimport-v-fileclient.cer-keystoreserver.keystore

输入keystore密码:客户端证书密码

再次输入新密码:重复

所有者:CN=localhost,OU=ysb,O=ysb,L=nj,ST=js,C=en

签发人:CN=localhost,OU=ysb,O=ysb,L=nj,ST=js,C=en

序列号:4d9d7980

有效期:ThuApr0716:44:48CST2011至WedJul0616:44:48CST2011

证书指纹:

MD5:72:2D:DD:20:2A:CA:3B:D0:E8:E3:5E:BF:90:FE:D0:83

SHA1:77:9E:35:98:83:C8:F4:64:7E:ED:A2:91:C7:4A:27:0A:C0:18:BE:4D

签名算法名称:SHA1withRSA

版本:3

信任这个认证?[否]:y

认证已添加至keystore中

正在存储server.keystore]

说明:

client.cer:导出后缀名为‘.cer’的证书文件(方便将客户端证书导入到服务器添加信任)

client.cer:转换后的客户端证书文件

server.keystore:服务器证书文件

注意:如果是单向认证则只需生成服务器证书即可

5.打开Tomcat根目录下的/conf/server.xml,找到如下配置段

<Connectorport="8443"protocol="HTTP/1.1"SSLEnabled="true"

maxThreads="150"scheme="https"secure="true"

clientAuth="false"sslProtocol="TLS"

/>

注意:属性clientAuth的属性值如果是双向认证则为true如果是单向认证则我false默认为false

添加属性

单向认证:

keystoreFile="tomcat.keystore"keystorePass="password"

双向认证:

keystoreFile="tomcat.keystore"keystorePass="password"

truststoreFile="tomcat.keystore"truststorePass="password"

注意:双向认证双击client.p12文件按提示将证书导入浏览器

完成以上步骤就可以使用HTTPS协议了

测试:将访问项目的地址的协议手动改成HTTPS,端口改成8443。

说明:8443:在tomcat里https默认端口是8443(可以自己修改)

tomcat.keystore:生成的服务器证书存放路径

password:为服务器证书的密码

第二步使用JSONP完成跨域访问

使用Jquery的jQuery.getJSON(url,[data],[callback])函数发送跨域请求

例:

使用http协议时请求为:

$.post("http://localhost:8080/rcs/userAction!login.action",{account:cfg.account,password:cfg.password},cfg.callback,"json");

使用jsonp发送https协议请求

$.getJSON("https://localhost:8443/rcs/userAction!login.action?callback=?",{account:cfg.account,password:cfg.password},cfg.callback);

注意:使用jQuery.getJSON(url,[data],[callback])发送跨域请求后,在返回json数据时必须以callback({“result”:”result”})这样的格式才能被解析,所以必须在后台手动编码将数据组装成这样的格式

如:

response.setContentType("application/json;charset=UTF-8");

Stringcallback=request.getparmeter(“callback”);

PrintWriterout1=response.getWriter();

out1.print(callback+"({\"result\":\""+result+"\"})");

格式为:jsonp1302167636138({"result":"0"})

说明:jQuery.getJSON(url,[data],[callback]):在jQuery中,您可以通过使用JSONP形式的回调函数来加载其他网域的JSON数据,如"myurl?callback=?"。jQuery将自动替换?为正确的函数名,以执行回调函数。

Callback:为请求时jsonp的名如:callback=?

jsonp1302167636138:为jsonp自动生成的用于替换“?”的。

第三步自动将证书导入浏览器

在第一次使用jsonp发送HTTPS协议请求时IE浏览器会提示导入证书,但是火狐和其它浏览器会直接请求失败不会给予提示,所以需要在第一次发送请求之前就将证书导入到浏览器。

参考实现方式:

在第一次访问项目时在请求入口(如:struts2的拦截器)将该请求重定向为HTTPS协议请求,这样在第一次访问时就会提示导入证书,重定向为HTTPS请求后浏览器会一直使用这协议发送请求,这样会影响系统的运行效率,所以我们在完成证书导入后还需要将请求协议重定向回HTTP。

如:

StringreqUrl=request.getRequestURL();

If(reqUrl.indexOf(“http”)>=0&&requrl.indexOf(“index.action”)>=0){

response.sendRedirect(“https://localhost:8443/rcs/index.action”);

}else{

If(reqUrl.indexOf(“https”)>=0&&requrl.indexOf(“login.action”)>=0){

response.sendRedirect(“http://localhost:8080/rcs/login.action”);

}

}

注意:重定向时的请求不能是ajax的(如:userAction!login.action)。

这样在第一次访问项目时浏览器就会提示添加信任。

步骤如下:

火狐浏览器:

不能贴图片,请查看附件

IE浏览器:

不能贴图片,请查看附件

相关推荐