Http协议
同步和异步
同步概念:请求与响应
异步概念:服务器端不需要及时响应到客户端,服务器处理后推送给客户端
请求
时间戳
请求同一东西东西,第一次请求响应码是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+验证码