`

Servlet重定向(sendRedirect)流程简析

阅读更多

    我们知道,当一个请求到达Servlet时,如果你不想处理该请求,你可以将请求分派(转发)给Web引用中的另一个组件(Servlet或Jsp等)来处理(即转发),又或者可以把请求重定向到另一个完全不同的URL来处理(即重定向)。注意,请求分派发生在服务器端,由服务器完成,而重定向发生在客户端,由客户(浏览器)完成。关于两者的详细区别,可以参考:《Servlet中请求转发和重定向的原理及区别》

 

下面主要介绍下重定向到底是怎么个过程?

 

1、客户在浏览器地址栏键入了一个(访问Servlet的)URL,并按下回车键。

 

2、请求到达Web服务器(及Web容器)。

 

3、Web容器找到指定的Servlet。

 

4、Servlet不想(或不该)它处理这个请求,而觉得应当将这个请求重定向到另外一个不同的URL处理。

 

5、于是Servlet调用sendRedirect("另一个URL"),重定向到另一个URL。

 

6、Servlet向Web容器(然后返回给Web容器)返回一个带有重定向信息的响应,Web服务器将响应返回给浏览器。该响应主要包含以下两个重要的信息:

 

    1)响应状态码为“302“,意思是请求的资源已经永久(或暂时)移动到了新的位置。

    2)一个Location首部,值是一个新的URL(Servlet重定向的)。

 

7、浏览器收到了响应,但发现这个响应的状态码是“302”,它就知道这是个重定向的响应,然后它就会寻找“Location”首部信息。

 

8、浏览器得到“Location”首部的值后,就会使用该URL建立一个新的请求并发给服务器(此时可以发现浏览器的地址栏URL已经变成了新的URL)。

 

9、服务器根据所请求URL找到相应的资源并返回给浏览器。

 

10、浏览器显示重定向后的新页面(用户可能会奇怪,怎么跳到这里了?)。

 

补充说明(注意点):

 

    1)不能在响应提交之后(已经向流中写了东西)再调用sendRedirect(),否则你将会得到一个IllegalStateException异常。

    2)在你的Servlet中,你必须要做个决定:要么自己处理请求,要不使用SendRedirect()让别人来处理。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics