跳至主要內容

Http

chensino必会大约 2 分钟

必看手册

https://developer.mozilla.org/zh-CN/docs/Web/HTTP

一、状态码

1.1 3xx

1.1.1 304

HTTP 304 Not Modified 说明无需再次传输请求的内容,也就是说可以使用缓存的内容。这通常是在一些安全的方法(safe),例如GET 或HEAD 或在请求中附带了头部信息: If-None-Match 或If-Modified-Since。

如果是 200 OK ,响应会带有头部 Cache-Control, Content-Location, Date, ETag, Expires,和 Vary.

温馨提示

很多浏览器的 开发者工具 会发出额外的请求,以达到 304 的目的,这样可以把资源以本地缓存的形式展现给开发者。一般缓存静态文件,如果用户在服务器上修改了静态文件,则请求时服务器会读取其修改时间, 这样就知道此文件是已修改过的,需要重新响应给浏览器修改后的内容。

比如以下请求,浏览器会自动携带If-Modified-Since请求头,然后拿这个时间和服务器上文件修改时间对比,如果服务器上的时间比这个新,就会返回200,否则返回304。 20221101150553

另外浏览器有个Disable cache选择项,勾选此项代表不允许浏览器自动携带If-Modified-Sinc请求头,也就无法使用本地缓存了。当使用Ctrl+F5刷新页面时也是同样的道理,不携带If-Modified-Sinc请求头。 20221101150938

二、http请求

2.1 302重定向

请求被重定向后,是无法给客户端响应ResbonseBody,但是可以有Response Header,测试代码如下,请求http://localhost:8888/hello/cookie,在请求处理逻辑里面 添加一个cookie,然后重定向到百度。可以看到如下代码我有设置返回值,但是其实毫无意义,在return之前就被redirect到了百度。同时,在Response Headers中可以看到有 Cookie: test=aaaaaa,并且打开localhost能看到在下面有对应的cookie

@Controller
@RequestMapping("hello")
public class HttptestApplication {

    @RequestMapping("cookie")
    public String sayHi(HttpServletResponse response) throws IOException {
        Cookie cookie = new Cookie("test","aaaaaa");
        response.addCookie(cookie);
        response.sendRedirect("http://www.baidu.com");
        return "hello";
    }
}

20221102170142

使用工具查看localhost下的cookie 20221102170819

二、http协议

2.1 http协议是什么

三、Headers

3.1 中文header

无论请求头还是响应头,是不支持中文的,如果要支持中文需要自己编码,比如使用UrlEncode编码,前端获取请求头再解码即可,


 URLEncoder.encode("中文", "UTF-8")

let chineseStr = decodeURI(header)