深入理解http协议
概念
http协议:超文本传输协议,基于socket与tcp协议。
- 请求
- 请求行
- 请求头
- 请求内容
- 请求体(只能在post请求中)
- 响应
防盗链
原理:通过请求头中的referer值进行判断,若不等于本站域名说明就是其他网站在请求。
使用过滤器获取每次请求来源,并进行判断。
静态资源防盗链过滤器:
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 29 30 31 32 33 34 35
|
@WebFilter(filterName = "RefererFilter", urlPatterns = {"static/*"}) public class RefererFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException {
}
@Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServerRequest request = (HttpServerRequest) servletRequest; String referer = request.getHeader("referer"); String serverName = servletRequest.getServerName();
if (StringUtils.isBlank(referer) || !referer.contains(serverName)) { servletRequest.getRequestDispatcher("static/error.png").forward(servletRequest, servletResponse); } else { filterChain.doFilter(servletRequest, servletResponse); } }
@Override public void destroy() {
} }
|
重定向实现原理
服务端收到请求后设置响应状态为302,将重定向地址放入响应头的Location
中,客户端收到响应浏览器判断状态为302并自动跳转到Location值的地址。
1 2 3 4 5 6 7 8 9 10 11
| @WebServlet("/servlet1") public class Servlet1 extends HttpServlet {
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setStatus(302); resp.setHeader("Location", getServletContext().getContextPath() + "servlet2"); } }
|
1 2 3 4 5 6 7 8
| @WebServlet("/servlet2") public class Servlet2 extends HttpServlet {
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.getWriter().write("this is servlet2"); } }
|
https与http的区别
- https协议需要到ca申请证书,一般证书都需要收费
- http中的数据是明文传输,而https则是具有安全性的ssl加密传输协议
- http与https使用的是完全不同的连接方式,http一般使用80端口,https一般使用443端口
- http的连接很简单,是无状态的,而hhtps协议是由ssl+http协议构建的,可进行加密传输、身份认证的网络协议,比http协议安全,但效率低
模拟http请求技术