【Java.Web】Servlet —— 请求的重定向
来源:互联网 发布:菜鸟学java 编辑:程序博客网 时间:2024/06/06 00:04
请求重定向
HTTP协议规定了一种重定向机制:
- 用户在浏览器端输入特定的URL,请求访问服务器端的某个组件
- 服务器端的组件返回一个状态代码为302的响应结果,该响应结果的含义为:让浏览器端再请求访问另一个Web组件。在响应的结果中提供了另一个Web组件的URL。另一个Web组件有可能在同一个Web服务器上,也有可能不在同一个Web服务器上
- 当浏览器端接受到这种响应结果后,再立即自动请求另一个Web组件
- 浏览器端接受到来自另一个Web组件的响应结果
在Java Servlet API中,HttpServeltResponse接口的sendRedirect(String location)方法用于重定向,而在ServletResponse接口中没有这个方法,因为重定向机制是由HTTP协议规定的。
javax.servlet.httppublic interface HttpServletResponseextends ServletResponse{ voidsendRedirect(String location) Sends a temporary redirect response to the client using the specified redirect location URL and clears the buffer}
- 调用sendRedirect()方法会清空response buffer,因此Servlet源组件生成的响应结果不会被发送到客户端;客户端最后接受的目标组件的响应结果
- 如果源组件在进行重定向之前,已经提交了响应结果(flush(),close()),那么sendRedirect()方法将会抛出IllegalStateException;为了避免异常,不应该在源组件中提交响应结果
- 在源组件中,sendRedirect()调用后面的代码也会被执行
- 源组件和目标组件不共享同一个ServletRequest对象,因此不共享请求范围内的共享数据
- 对于response.sendRedirect(String location)方法中的参数location,如果不以“/”开头,表示相对于当前源组件的路径;如果以“/”开头,表示相对于当前服务器根路径的URL,如果以“http://”开头,表示一个完整的internet上的路径;
- 目标组件不必是同一个服务器上的同一个Web应用的组件,它可以是Internet上的任意一个有效的网页
示例:
创建一个源组件,在其中将请求转发给另一个组件:
package com.gof.test.servlet;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.http.HttpServlet;import javax.servlet.ServletException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.ServletContext;public class RedirectSourceServlet extends HttpServlet {/** * */private static final long serialVersionUID = -729582654304035822L;protected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException{PrintWriter out = resp.getWriter();// try to get the parameter form requestString username = req.getParameter("username");String message = null;if (username == null){message = "Please input username.";}else{message = "Hello, " + username;}// try to add an attribute into the requestreq.setAttribute("msg", message);out.println("Output from RedirectSourceServlet before redirecting.");// print to consoleSystem.out.println("Output from RedirectSourceServlet before redirecting.");// redirect//resp.sendRedirect("/base-webapp/redirectdest?msg=" + message); resp.sendRedirect("redirectdest?msg=" + message);out.println("Output from RedirectSourceServlet after redirecting.");// print to consoleSystem.out.println("Output from RedirectSourceServlet after redirecting.");}}
目标组件为:
package com.gof.test.servlet;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.http.HttpServlet;import javax.servlet.ServletException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.ServletContext;public class RedirectDestinationServlet extends HttpServlet {protected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException{String message = (String)req.getAttribute("msg");System.out.println("The attribute added by Source Sevelt is " + message);message = req.getParameter("msg");PrintWriter out = resp.getWriter();out.println(message);out.close();}}
在web.xml中注册:
<!-- Redirect request --> <!-- test url = http://localhost:8080/base-webapp/redirectsrc?username=New User --> <servlet> <servlet-name>redirectsrc</servlet-name> <servlet-class>com.gof.test.servlet.RedirectSourceServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>redirectsrc</servlet-name> <url-pattern>/redirectsrc</url-pattern> </servlet-mapping> <servlet> <servlet-name>redirectdest</servlet-name> <servlet-class>com.gof.test.servlet.RedirectDestinationServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>redirectdest</servlet-name> <url-pattern>/redirectdest</url-pattern> </servlet-mapping>
在浏览器中请求如下URL:
http://localhost:8080/base-webapp/redirectsrc?username=New User
可以看到浏览器显示的结果如下:
该请求由两部分组成,第一部分的response中的返回状态码为302,并包含重定向的URL。
同时,浏览器显式的URL变为:
http://localhost:8080/base-webapp/redirectdest?msg=Hello,%20New%20User
在console中打印出的信息为:
Output from RedirectSourceServlet before redirecting.Output from RedirectSourceServlet after redirecting.The attribute added by Source Sevelt is null
可以看到sendRedirect()方法后面的代码仍然会被执行;但是源组件中写入response中的内容不会被发送到客户端。
源组件和目标组件不共享请求范围内的数据,源组件向请求中存放的信息,在目标组件中无法获取该信息。
修改1:
在执行sendRedirect()方法之前,在源组件之前调用flush()方法;将会抛出IllegalStateException异常,同时浏览器会显示出源组件之前输出的内容。
修改2:
将sendRedirect()方法传入一个无效的servlet url,服务器端将返回页面未找到-404的错误提示。
修改3:
将sendRedirect()方法的参数修改为其他的internet网页,如“http://baidu.com”,请求访问源组件将指向这个网页。
0 0
- 【Java.Web】Servlet —— 请求的重定向
- java web Servlet学习笔记-2 请求重定向和请求转发的区别
- Servlet(10)—请求转发和请求重定向
- Servlet请求重定向
- servlet的重定向与请求分派
- servlet的重定向和请求转发
- servlet的请求转发与重定向
- Servlet的请求转发和重定向
- servlet的请求转发和重定向
- servlet的请求转发和重定向
- Java Web里的请求转发和重定向
- Java Web 请求的转发和重定向
- servlet的请求转发和请求重定向的理解
- 07.servlet请求重定向
- Servlet请求转发和请求重定向之间的区别
- Web——请求转发与响应重定向
- Java Web 请求转发与请求重定向
- Servlet入门介绍第四章——Servlet中的请求转发、包含、重定向
- Java编程算法基础----递归与循环关系
- javaweb之Maven项目管理工具学习
- 【日志】新手对接口的自我理解(帮忙指正,谢谢)
- Unique Paths
- nginx在linux下的安装
- 【Java.Web】Servlet —— 请求的重定向
- Bull Math(java大数相乘)
- FEDERATED存储引擎的使用,如何开启FEDERATED,FEDERATED Support NO?
- 学习了这么久,资料整理了一大堆,马上毕业了,开始写写博客,以后慢慢看。。
- Binary Tree Inorder Traversal
- 一.贪心算法 喷水装置(一)
- PAT 2-11 两个有序链表序列的合并(C语言实现)
- 基于c#的两种最小凸包的生成(三硬币法与串行算法)
- 一个牛人给java初学者的建议,文章写得很好,发给大家看看