码迷,mamicode.com
首页 > 其他好文 > 详细

response.sendRedirect的细节

时间:2014-10-19 21:15:03      阅读:250      评论:0      收藏:0      [点我收藏+]

标签:http   io   os   ar   使用   java   sp   div   on   

今天敲书上的例子的时候无意间发现,response中的sendRedirect()重定向到另一个servlet时,调用的是doget方法,不明所以,百度得知,原来还牵扯到http协议的细节问题,原文如下:

servlet重定向一般采用response.sendRedirect()来处理,要明白其中的细节,还需了解HTTP协议的一些内容,简单点就是要了解HTTP请求报头、HTTP状态码、HTTP响应报头的一些参数。 

sendRedirect()简单点就是做了两件事情: 
设置HTTP响应报头中的Status为302; 
设置HTTP响应报头中的Location值为指定的URL; 
简单相当于这样: 

Java代码  bubuko.com,布布扣
  1. response.setStatus(302);  
  2. response.setHeader("Location", "OtherServlet");  



浏览器会根据状态码来作出相应的响应; 

浏览器对相应的状态码的响应(这里只给出了几个3开头的)是: 
302 作为HTTP1.0的标准,以前叫做Moved Temporarily ,现在叫Found. 现在使用只是为了兼容性的处理,response.sendRedirect()的默认Location重定向用的是302. 
但是HTTP 1.1 有303 和307作为详细的补充,其实是对302的细化 
303:对于POST请求,它表示请求已经被处理,客户端可以接着使用GET方法去请求Location里的URI。 
307:对于POST请求,表示请求还没有被处理,客户端应该向Location里的URI重新发起POST请求。 

浏览器对302的响应,默认情况下,使用HTTP协议的GET方法提交请求,最初请求的内容(比如 POST 参数)也就丢失了。 
所以response.sendRedirect()是不能让浏览器来以post方法提交请求的。 

你想在servlet中用post传参数,在浏览器支持HTTP1.1的情况下可以设置状态码为307: 

Java代码  bubuko.com,布布扣
  1. response.setStatus(307);  
  2. response.setHeader("Location", "OtherServlet");  



这样浏览器就会向Location里的URI重新发起POST请求。 

http://www.iteye.com/problems/61747

response.sendRedirect的细节

标签:http   io   os   ar   使用   java   sp   div   on   

原文地址:http://www.cnblogs.com/bruce-L/p/4035428.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!