1. http 302
  2. http 303

Http 302

302是一个普通的重定向代码。直观的看来是,请求者(浏览器或者模拟http请求)发起一个请求,然后服务端重定向到另一个地址。而事实上,服务端仅仅是增加一条属性到header,location=重定向地址。而一般的,浏览器会自动的再去请求这个location,重新获取资源。也就是说,这个会使得浏览器发起两次请求。

Example

Client request:

GET /index.html HTTP/1.1

Host: www.example.com

Server response:

HTTP/1.1 302 Found

Location: http://www.iana.org/domains/example/

实验

  1. 首先,我们用一个Map来存储信息,key为username,value为随机数。
  2. 当我请求list的时候,跳转到users,来获取所有的用户。

Map<String, Double> users = new HashMap<>(); @RequestMapping(value = "/list", method = RequestMethod.GET)
public String index(){
return "redirect:/users";
} @ResponseBody
@RequestMapping(value = "/users", method = RequestMethod.GET)
public ResponseEntity getUsers(){
ResponseEntity responseEntity = new ResponseEntity(users, HttpStatus.OK);
return responseEntity;
}

当时用浏览器访问的时候,会明显的看到浏览器地址变了,也就是说我明明请求的是list,结果你给我变成了users。然而,由于浏览器帮我们做了跳转的工作,我们感觉不出来,但从地址栏还是可以看到的。

查看

通过拦截请求可以看出来,访问了两次:

并且list是302,而users是200.也就是说list进行了重定向。再来看list的response:

Request URL:https://localhost:8443/list
Request Method:GET
Status Code:302
Remote Address:127.0.0.1:8888 Response Headers
view source
Cache-Control:no-cache, no-store, max-age=0, must-revalidate
Content-Language:zh-CN
Content-Length:0
Date:Thu, 08 Sep 2016 14:31:33 GMT
Expires:0
Location:https://localhost:8443/users
Pragma:no-cache
Strict-Transport-Security:max-age=31536000 ; includeSubDomains
X-Application-Context:application:dev:8443
X-Content-Type-Options:nosniff
X-Frame-Options:DENY
X-XSS-Protection:1; mode=block Request Headers
view source
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate, sdch, br
Accept-Language:zh-CN,zh;q=0.8
Authorization:Basic YWRtaW46dGVzdA==
Connection:keep-alive
Host:localhost:8443
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36

最关键的就是location:

Location:https://localhost:8443/users

浏览器获取到这个资源定位后就GET访问获取。所以users的请求是这样的:

Request URL:https://localhost:8443/users
Request Method:GET
Status Code:200
Remote Address:127.0.0.1:8888 **Response Headers**
view source
Cache-Control:no-cache, no-store, max-age=0, must-revalidate
Content-Type:application/json;charset=UTF-8
Date:Thu, 08 Sep 2016 14:31:33 GMT
Expires:0
Pragma:no-cache
Strict-Transport-Security:max-age=31536000 ; includeSubDomains
Transfer-Encoding:chunked
X-Application-Context:application:dev:8443
X-Content-Type-Options:nosniff
X-Frame-Options:DENY
X-XSS-Protection:1; mode=block **Request Headers**
view source
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate, sdch, br
Accept-Language:zh-CN,zh;q=0.8
Authorization:Basic YWRtaW46dGVzdA==
Connection:keep-alive
Host:localhost:8443
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36

redirect的另一个作用是原请求的内容将会被舍弃,即如果是post请求,redirect的时候默认是不带参数的。与之相对应的forward的请求是转发,只有一次请求,并且带body转发过去。


Http 303

303 See Other。通常是指所请求的资源在别的地方,并且同302一样,会在header中的location标明资源的位置。在我的一个是使用过程中,我想要创建一个user,当关于这个user的key已经存在的时候,server将返回303,并且告之这个user的获取位置。

Example

Client request:

POST / HTTP/1.1

Host: www.example.com

Server response:

HTTP/1.1 303 See Other

Location: http://example.org/other

实验

我将要发送post请求创建user,如果user已经存在则返回303


Map<String, Double> users = new HashMap<>(); @ResponseBody
@RequestMapping(value = "/users", method = RequestMethod.POST)
public ResponseEntity createUser(String username){
Double luckNum = users.get(username);
if (luckNum ==null){
double random = Math.random();
users.put(username, random);
return new ResponseEntity(random,HttpStatus.OK);
}else{
MultiValueMap<String,String> headers = new HttpHeaders();
headers.add("Location", "/users/"+username);
return new ResponseEntity(luckNum, headers, HttpStatus.SEE_OTHER);
}
} @ResponseBody
@RequestMapping(value = "/users/{username}", method = RequestMethod.GET)
public ResponseEntity getUser(@PathVariable("username") String username){
ResponseEntity responseEntity = new ResponseEntity("I'm user, My name is "+ username+ " And my luck num is "+users.get(username), HttpStatus.OK);
return responseEntity;
}

发送

查看拦截

可以看到,post的时候返回303,并且在返回的response的header中添加了:

Location: /users/test

所以see other的意思就是去别的地方看看。值得注意的是,如果返回303,但是没有添加location,那么只会查看一条请求303.而在httpclient的默认处理中,这时候会抛出exception:location not found。

参考

重定向Http status code 303 和 302的更多相关文章

  1. 详解重定向(HTTP状态码301/302/303/307/408)附例子

    本文为原创文章,转载请注明出处. 今天打算好好把状态码301.302.303.307.308好好撸一遍,并会测试下一些例子. 状态码的解释 我们都知道重定向与这几种状态码有关,来看下这几种HTTP状态 ...

  2. http status code

    属于转载 http status code:200:成功,服务器已成功处理了请求,通常这表示服务器提供了请求的网页 404:未找到,服务器未找到 201-206都表示服务器成功处理了请求的状态代码,说 ...

  3. 常见http status code

    常见http status code 常见的状态码: HTTP: Status200– 服务器成功返回网页 HTTP: Status404– 请求的网页不存在 HTTP: Status503– 服务不 ...

  4. HTTP状态码(HTTP Status Code)【转】

    HTTP状态码(HTTP Status Code) 一些常见的状态码为: 200 - 服务器成功返回网页 404 - 请求的网页不存在 503 - 服务不可用 所有状态解释:点击查看 1xx(临时响应 ...

  5. 500 status http status code 状态码

    https://developer.mozilla.org/en-US/docs/Web/HTTP/Status Server error responses 500 Internal Server ...

  6. HTTP协议状态码详解(HTTP Status Code)(转)

    原文链接:HTTP协议状态码详解(HTTP Status Code) 使用ASP.NET/PHP/JSP 或者javascript都会用到http的不同状态,一些常见的状态码为: 200 – 服务器成 ...

  7. 常见的HTTP状态码(HTTP Status Code)

    HTTP状态码 当使用浏览器访问一个网页时,浏览器会向网页所在服务器发出请求.当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码的信息头(server header)用以响应浏览 ...

  8. status http status code 状态码

    RFC 6585 - Additional HTTP Status Codes https://tools.ietf.org/html/rfc6585 https://developer.mozill ...

  9. HTTP Status Code [RFC]

    来源:http://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml Hypertext Transfer Prot ...

随机推荐

  1. ASP.NET Aries 入门开发教程2:配置出一个简单的列表页面

    前言: 朋友们都期待我稳定地工作,但创业公司若要躺下,也非意念可控. 若人生注定了风雨飘摇,那就雨中前行了. 最机开始看聊新的工作机会,欢迎推荐,创业公司也可! 同时,趁着自由时间,抓紧把这系列教程给 ...

  2. JAVA回调机制(CallBack)详解

    序言 最近学习java,接触到了回调机制(CallBack).初识时感觉比较混乱,而且在网上搜索到的相关的讲解,要么一言带过,要么说的比较单纯的像是给CallBack做了一个定义.当然了,我在理解了回 ...

  3. 高性能IO模型浅析

    高性能IO模型浅析 服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-blocking  ...

  4. webapi - 模型验证

    本次要和大家分享的是webapi的模型验证,讲解的内容可能不单单是做验证,但都是围绕模型来说明的:首先来吐槽下,今天下午老板为自己买了套新办公家具,看起来挺好说明老板有钱,不好的是我们干技术的又成了搬 ...

  5. 【NLP】揭秘马尔可夫模型神秘面纱系列文章(一)

    初识马尔可夫和马尔可夫链 作者:白宁超 2016年7月10日20:34:20 摘要:最早接触马尔可夫模型的定义源于吴军先生<数学之美>一书,起初觉得深奥难懂且无什么用场.直到学习自然语言处 ...

  6. MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决

    一.简介 MySQL是最流行的开放源码SQL数据库管理系统,它是由MySQL AB公司开发.发布并支持的.有以下特点: MySQL是一种数据库管理系统. MySQL是一种关联数据库管理系统. MySQ ...

  7. Java 时间类-Calendar、Date、LocalDate/LocalTime

    1.Date 类 java.util.Date是一个"万能接口",它包含日期.时间,还有毫秒数,如果你只想用java.util.Date存储日期,或者只存储时间,那么,只有你知道哪 ...

  8. const let,console.log('a',a)跟console.log('a'+a)的区别

    const 创建一个只读的常量 let块级作用域 const let重复赋值都会报错 console.log('a',a) a console.log('a'+a) a2 逗号的值会有空格:用加号的值 ...

  9. zookeeper集群的搭建以及hadoop ha的相关配置

    1.环境 centos7 hadoop2.6.5 zookeeper3.4.9 jdk1.8 master作为active主机,data1作为standby备用机,三台机器均作为数据节点,yarn资源 ...

  10. vim+vundle配置

    Linux环境下写代码虽然没有IDE,但通过给vim配置几个插件也足够好用.一般常用的插件主要包括几类,查找文件,查找符号的定义或者声明(函数,变量等)以及自动补全功能.一般流程都是下载需要的工具,然 ...