• HTTP协议


    1.什么是HTTP协议

       HTTP协议(Hypertext transfer protocol),也叫超文本传输协议,作用就是对浏览器客户端和服务器端之间数据传输的格式规范,

        它基于TCP的应用层协议,它不关心数据传输的细节,HTTP(超文本传输协议)是一个基于请求与响应模式的、无状态的、应用层的协议。

     2.HTTP协议的组成

    请求行:请求方式 + URL + 协议版本

    • 常见的请求方法有 GET、POST、PUT、DELETE、HEAD
    • 客户端要获取的资源路径(所谓的URL)
    • 客户端使用的 HTTP 协议版本号(目前使用的是http1.1)

    请求头:客户端向服务器发送请求的补充说明

    • host:请求地址
    • User-Agent: 客户端使用的操作系统和浏览器的名称和版本.
    • Content-Length:发送给HTTP服务器数据的长度。
    • Content-Type:参数的数据类型
    • Cookie:将cookie的值发送给HTTP 服务器
    • Accept-Charset:自己接收的字符集
    • Accept-Language:浏览器自己接收的语言
    • Accept:浏览器接受的媒体类型

    请求体:一般携带的请求参数

    • application/json:{"name":"value","name1":"value2”}
    • application/x-www-form-urlencoded: name1=value1&name2=value2
    • multipart/from-data:表格形式
    • text/xml
    • content-type:octets/stream

    3.时间戳的作用

    时间戳的主要作用有两个,一个是可以在版本更新中使用,不同的时间戳代表不同的版本,

    二是解决浏览器缓存问题,一般都是在URL中加时间戳就会保证每一次发起的请求都是一个不同于之前的请求,这样就能避免浏览器对URL的缓存

    例如当一个页面中请求了同一张图片两次的时候,第二次请求就不会到服务器了,而是从浏览器的缓存中找到这个资源。

    和缓存有关的状态码

    200 from memory cache 不访问服务器,直接读取缓存 ,从内存当中读取
    200 from disk cache 不访问服务器,直接读取缓存,从磁盘当中读取
    304 访问服务器,发现数据没有更新,服务器返回次状态码,然后再从缓存中读取数据

    4.防盗链(Java Filter解决)

    问题场景:当b服务器使用<img>等可以跨域的标签请求a服务器的静态资源时,或者之前访问资源的地址都是可以访问到资源的。

    但是对于a服务器来说,自己的资源怎么可以让别人随便访问呢?

    解决方案:在a服务器里添加过滤器,过滤那些非法的请求

    测试案例

    先修改C:WindowsSystem32driversetchosts文件

     ip后面的值可以随便写,这是之前做其他测试改的,这次懒得改了,配置头两个就好了,第一个代表a服务,第二个代表b服务

    a服务器页面

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    <img src="/images/houzi.jpg?t=15:26"/>
    <%--本次测试是在一台电脑上,加上时间戳不让其他的请求去请求缓存中的资源--%>
    </body>
    </html>

    在a项目中添加依赖

    !-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
        <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>javax.servlet-api</artifactId>
          <version>3.1.0</version>
          <scope>provided</scope>
        </dependency>

    修改web.xml文件

      <display-name>Archetype Created Web Application</display-name>
      <filter>
        <filter-name>MyFilter</filter-name>
        <filter-class>com.ty.filter.MyFilter</filter-class>
      </filter>
      <filter-mapping>
        <filter-name>MyFilter</filter-name>
        <url-pattern>/images/*</url-pattern>
      </filter-mapping>

    添加Filter类

    package com.ty.filter;
    
    import javax.jws.WebService;
    import javax.servlet.*;
    import javax.servlet.annotation.WebFilter;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    public class MyFilter implements Filter {
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
            System.out.println("-------过滤器初始化-------------");
        }
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            System.out.println("-------拦截到请求-------------");
            HttpServletRequest httpServletRequest=(HttpServletRequest)request;
            HttpServletResponse httpServletResponse=(HttpServletResponse)response;
            String referer = httpServletRequest.getHeader("Referer");
            String serverName = httpServletRequest.getServerName();
            System.out.println(referer+"----"+serverName);
            if (referer==null||!referer.contains(serverName)){
                request.getRequestDispatcher("/images/error.png").forward(httpServletRequest,httpServletResponse);
            return;
            }
            chain.doFilter(httpServletRequest,httpServletResponse);
        }
    
        @Override
        public void destroy() {
            System.out.println("-------过滤器销毁-------------");
    
        }
    }

    b服务器页面,在img标签中访问a服务的资源

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    <img src="http://eureka7001.com:6060/images/houzi.jpg">
    </body>
    </html>

    4:重定向流程

    平时写的重定向代码httpServletResponse.sendRedirect("/a");

    其实就相当于下面这两行

    httpServletResponse.setStatus(302);
    httpServletResponse.setHeader("location","/a");

    重定向和转发的区别和流程,参考https://blog.csdn.net/u010452388/article/details/80398929

  • 相关阅读:
    【剑指offer】字符串转整数
    怎样让js不产生冲突,避免全局变量的泛滥,合理运用命名空间
    [每天一个知识点]34-职业生涯-用得着和用不着的知识
    真机iOS SDK升级后xcode不能进行真机调试 怎么办
    SPOJ 11840. Sum of Squares with Segment Tree (线段树,区间更新)
    Atitit.Gui控件and面板----web server区----- web服务器监控面板and控制台条目
    Struts2+Spring+Hibernate step by step 03 整合Spring之中的一个(在DAO层验证username和password)
    WPF中控件ListView和DataGrid典型属性介绍
    leetcode
    layer:好看的弹出窗口
  • 原文地址:https://www.cnblogs.com/yjc1605961523/p/12259916.html
Copyright © 2020-2023  润新知