Http协议

Http协议

同步和异步

同步概念:请求与响应

异步概念:服务器端不需要及时响应到客户端,服务器处理后推送给客户端

请求

ss

时间戳

​ 请求同一东西东西,第一次请求响应码是200就是服务器拿资源,而且只请求一次,第二次就是304是从本地拿资源。这时候可以通过时间戳来防止浏览器缓存。

防盗链

什么是盗链:就是一些网站他的图片,视频等等资源来自于其他网站,他直接写其他网站资源所存储的绝对路径,并不是属于他自己的。

反盗链机制

1、java代码判断请求来源Referer

​ 过滤器,过滤器获取请求头来源字段,判断请求头中来源字段如果域名不是本地的,就过滤

<filter>
		<filter-name>ImgFilter</filter-name>
		<filter-class>com.hxy.filter.ImgFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>ImgFilter</filter-name>
		<url-pattern>/static/*</url-pattern>
	</filter-mapping>

public class ImgFilter implements Filter {

	public void init(FilterConfig filterConfig) throws ServletException {
		System.out.println("初始化...");
	}

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		System.out.println("doFilter....");
		HttpServletRequest req = (HttpServletRequest) request;
		HttpServletResponse res = (HttpServletResponse) response;
		//获取请求头中来源
		String referer = req.getHeader("referer");
		//获取当前请求名称
		String serverName = request.getServerName();
		System.out.println("referer:"+referer+"----serverName:"+serverName+":"+serverName);
	    if(referer==null||(!referer.contains(serverName))){
	    	req.getRequestDispatcher("/imgs/error.png").forward(req, res);
	    	return ;
	    }
		chain.doFilter(req, res);
	}

	public void destroy() {

	}

}

2、使用ngixn反向代理解决防盗链(白名单和黑名单)

http和https的区别

https ssl+证书传输— 非对称加密、证书加密 缺点:效率低、安全非常高

http:不安全 抓包工具(通过宽带连接,都可以通过抓包分析到请求的内容 post请求浏览器看不到提交的参数,但是抓包可以分析参数,一般电商架构 移动app借口 注册密码 加密传输 微信开发 ios自带浏览器 都需要https 没有证书的 无法访问)

长连接和短连接

http1.0:属于短连接

建立连接(三次握手)—》数据传输 —》关闭连接(四次挥手)

http1.1:保留连接,新增长连接(移动app消息推送 netty rpc远程调用)

建立连接(三次握手)—》数据传输 —》保持连接 —》传输数据 —》关闭

长连接什么时候关闭:

1、配置失效心跳检测时间,客户端没有继续建立链接,直接关闭;

2、客户端主动关闭

3、tomcat服务器配置长连接超时配置时间20分钟

跨域实战解决方案

跨域其实是浏览器的安全机制,请求访问的域名与ajax请求地址不一致,浏览器会直接无法返回请求结果

浏览器默认网站资源必须同一域名请求

怎么解决

1、jsonp支持get请求但是不支持post请求

dataType: ‘jsonp’, // 数据类型

jsonp: ‘backfunc’, // 指定回调函数名,与服务器端接收的一致,并回传回来

jsonp底层原理是在jquery 源码中, jsonp的实现方式是动态添加


2、使用接口网管 nginx springcloud zull —-互联网公司解决方案

搭建api接口网关(涉及到nginx)

3、httpclient内部转发

​ 浪费资源,不存在跨域问题,安全 抓包分析不到

4、添加header请求头允许访问

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

表单重复提交

网路延迟、刷新(重新加载)、点击后退、回退重复提交数据(解决方式-token)

如何解决

1、前端:加一个标识或者让按钮变灰

2、后端:token

什么是token:令牌,有效期,唯一不重复的标识,类似于sessionID

具体的做法:

在服务器端生成一个唯一的随机标识号,专业术语称为Token(令牌),同时在当前用户的Session域中保存这个Token。然后将Token发送到客户端的Form表单中,在Form表单中使用隐藏域来存储这个Token,表单提交的时候连同这个Token一起提交到服务器端,然后在服务器端判断客户端提交上来的Token与服务器端生成的Token是否一致,如果不一致,那就是重复提交了,此时服务器端就可以不处理重复提交的表单。如果相同则处理表单提交,处理完后清除当前用户的Session域中存储的标识号。(唯一性)

转发代码

@WebServlet("/ForwardServlet")
public class ForwardServlet extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		req.getSession().setAttribute("sesionToken", TokenUtils.getToken());
		req.getRequestDispatcher("form.jsp").forward(req, resp);
	}
}

前段代码

<body>
	<form action="${pageContext.request.contextPath}/DoFormServlet"
		method="post" onsubmit="return dosubmit()">
		<input type="hidden" name="token" value="${sesionToken}"> 用户名:<input type="text"
			name="userName"> <input type="submit" value="提交" id="submit">
	</form>
</body>

防止模拟请求:token+验证码

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦