Web高级知识-跨域&XSS&CSRF解决方案

Web高级知识-跨域&XSS&CSRF解决方案
http长连接与短连接

HTTP协议与TCP/IP协议的关系

HTTP的长连接和短连接本质上是TCP长连接和短连接。HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议。IP协议主要解决网络路由和寻址问题,TCP协议主要解决如何在IP层之上可靠的传递数据包,使在网络上的另一端收到发端发出的所有包,并且顺序与发出顺序一致。TCP有可靠,面向连接的特点。

跨域实战解决方案

跨域原因产生:在当前域名请求网站中,默认不允许通过ajax请求发送其他域名。,说白了就是对ajax有限制
服务器端代码

@WebServlet("/FromServlet")
public class FromServlet extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		String userName = req.getParameter("userName");
		JSONObject jsonObject = new JSONObject();
		jsonObject.put("userName", userName);
		resp.getWriter().println(jsonObject.toJSONString());
	}
}

前端代码

<%@ 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">
<title>B网站访问</title>
</head>
<script type="text/javascript"
	src="http://www.itmayiedu.com/static/common/jquery-1.7.2.min.js?t=2017-07-27"></script>
<script type="text/javascript">
	$(document).ready(function() {
		$.ajax({
			type : "GET",
			async : false,
			url : "http://a.a.com/a/FromServlet?userName=644064",
			dataType : "json",
			success : function(data) {
				alert(data["userName"]);
			},
			error : function() {
				alert('fail');
			}
		});
		</script>
<body>
	<img alt="" src="http://a.a.com/a/imgs/log.png">
</body>
</html></script>
<body>
	<img alt="" src="http://a.a.com/a/imgs/log.png">
</body>
</html>

	});

XMLHttpRequest cannot load 跨域问题解决办法

1.使用后台response添加header
后台response添加header,response.setHeader(“Access-Control-Allow-Origin”, “*”); 支持所有网站

2.使用JSONP
前端代码:

$.ajax({
			type : "POST",
			async : false,
			url : "http://a.a.com/a/FromUserServlet?userName=张三",
			dataType : "jsonp",//数据类型为jsonp  
			jsonp : "jsonpCallback",//服务端用于接收callback调用的function名的参数  
			success : function(data) {
				alert(data.result);
			},
			error : function() {
				alert('fail');
			}
		});

jquery 中jsonp的实现原理

在同源策略下,在某个服务器下的页面是无法获取到该服务器以外的数据的,即一般的ajax是不能进行跨域请求的。但 img、iframe 、script等标签是个例外,这些标签可以通过src属性请求到其他服务器上的数据。利用 script标签的开放策略,我们可以实现跨域请求数据,当然这需要服务器端的配合。 Jquery中ajax 的核心是通过 XmlHttpRequest获取非本页内容,而jsonp的核心则是动态添加

$.ajax({
url: ‘http://192.168.1.114/yii/demos/test.php’, //不同的域
type: ‘GET’, // jsonp模式只有GET 是合法的
data: {
‘action’: ‘aaron’
},
dataType: ‘jsonp’, // 数据类型
jsonp: ‘backfunc’, // 指定回调函数名,与服务器端接收的一致,并回传回来
})

其实jquery 内部会转化成
http://192.168.1.114/yii/demos/test.php?backfunc=jQuery2030038573939353227615_1402643146875&action=aaron
然后动态加载

然后后端就会执行backfunc(传递参数 ),把数据通过实参的形式发送出去。
  使用JSONP 模式来请求数据的整个流程:客户端发送一个请求,规定一个可执行的函数名(这里就是 jQuery做了封装的处理,自动帮你生成回调函数并把数据取出来供success属性方法来调用,而不是传递的一个回调句柄),服务器端接受了这个 backfunc函数名,然后把数据通过实参的形式发送出去

(在jquery 源码中, jsonp的实现方式是动态添加

后端代码:

@WebServlet("/FromUserServlet")
public class FromUserServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
	doPost(req, resp);
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
	resp.setCharacterEncoding("UTF-8");
	// resp.setHeader("Access-Control-Allow-Origin", "*");
	 String userName = req.getParameter("userName");
	 String userAge = req.getParameter("userAge");
	 System.out.println(userName + "----" + userAge+"---"+req.getMethod());
	// JSONObject JSONObject1 = new JSONObject();
	// JSONObject1.put("success", "添加成功!");
	// resp.getWriter().write("callbackparam(" + JSONObject1.toJSONString()
	// + ")");

	try {
		resp.setContentType("text/plain");
		resp.setHeader("Pragma", "No-cache");
		resp.setHeader("Cache-Control", "no-cache");
		resp.setDateHeader("Expires", 0);
		PrintWriter out = resp.getWriter();
		JSONObject resultJSON = new JSONObject(); // 根据需要拼装json
		resultJSON.put("result", "content");
		String jsonpCallback = req.getParameter("jsonpCallback");// 客户端请求参数
		out.println(jsonpCallback + "(" + resultJSON.toJSONString() + ")");// 返回jsonp格式数据
		out.flush();
		out.close();
	} catch (Exception e) {
		// TODO: handle exception
	}
}

JSONP的优缺点:
JSONP只支持get请求不支持psot请求

3. 后台Http请求转发

使用HttpClinet转发进行转发

4.使用接口网关

使用nginx转发。

5.使用SpringCloud网关

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java全栈研发大联盟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值