ajax http post to https

在本地同一个域http页面请求https页面,其实已经跨域了,我们知道出于安全问题的考虑,浏览器是不允许跨域访问的,那么如果使用ajax来实现跨域访问呢,开发中常用的解决方法很多,比较常用的是JSONP方法、window.name,JSONP方法是一种非官方方法,而且这种方法只支持GET方式,不如POST方式安全。即使使用jquery的jsonp方法,type设为POST,也会自动变为GET

经查资料:
如果跨域使用POST方式,可以使用创建一个隐藏的iframe来实现,但这样会比较麻烦
但是通过服务端设置Access-Control-Allow-Origin来实现跨越访问比较简单

在这里只对Access-Control-Allow-Origin做个小测试
先新建两个jsp页面,一个是test.jsp用来发送请求,accept.jsp用来接收请求
test.jsp

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
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script src="js/jquery.min.js" type="text/javascript"></script>
<title>Insert title here</title>
</head>
<body>
<form id="form">
<input name="t" value="123"/>
<input type="button" value="submit" onclick="ajaxSubmit(this)"/>
</form>
</body>
<script>
function ajaxSubmit(frm) {
$.ajax({
url: "/accept.jsp",
type: "POST",
data: $("#form").serialize(),
success: function(result) {
console.log(result);
}
});
}
</script>
</html>

accept.jsp

1
2
3
4
5
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
out.println("success-------->");
%>

这里accept页面简单的输出success

在浏览器上看看页面效果:

点击submit之后 查看浏览器控制台 正常返回success

那么假设把test.jsp中form的提交的url改成https之后呢。PS:具体本地怎么测试https请参考另一篇本地openssl生成证书

1
2
3
4
5
6
7
8
9
10
function ajaxSubmit(frm) {
$.ajax({
url: "https://localhost/accept.jsp",
type: "POST",
data: $("#form").serialize(),
success: function(result) {
console.log(result);
}
});
}

再看看浏览器效果:出现No ‘Access-Control-Allow-Origin’ header is present on the requested resource

然后在accept.jp加入headerAccess-Control-Allow-Origin

1
2
3
4
5
6
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
response.setHeader("Access-Control-Allow-Origin", "*");
out.println("success-------->");
%>
  • 表示允许任何域名跨域访问 一般线上不这么用,会指定某个域名
    最后来看下效果:请求成功返回