response.sendredirect
请求重定向
HTTP协议规定了一种重定向机制:
- 用户在浏览器端输入特定的URL,请求访问服务器端的某个组件
- 服务器端的组件返回一个状态代码为302的响应结果,该响应结果的含义为:让浏览器端再请求访问另一个Web组件。在响应的结果中提供了另一个Web组件的URL。另一个Web组件有可能在同一个Web服务器上,也有可能不在同一个Web服务器上
- 当浏览器端接受到这种响应结果后,再立即自动请求另一个Web组件
- 浏览器端接受到来自另一个Web组件的响应结果
在java Servlet API中,HttpServeltresponse接口的sendRedirect(String location)方法用于重定向,而在ServletResponse接口中没有这个方法,因为重定向机制是由http协议规定的。
[html] view plain copy
- javax.servlet.http
- public interface HttpServletResponse
- extends ServletResponse{
- void sendRedirect(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()调用后面的代码也会被执行
- 对于response.sendredirect(String location)方法中的参数location,如果不以“/”开头,表示相对于当前源组件的路径;如果以“/”开头,表示相对于当前服务器根路径的URL,如果以“http://”开头,表示一个完整的internet上的路径;
- 目标组件不必是同一个服务器上的同一个Web应用的组件,它可以是Internet上的任意一个有效的网页
示例:
创建一个源组件,在其中将请求转发给另一个组件:
[html] view plain copy
- 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 request
- String 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 request
- req.setAttribute("msg", message);
- out.println("Output from RedirectSourceServlet before redirecting.");
- // print to console
- System.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 console
- System.out.println("Output from RedirectSourceServlet after redirecting.");
- }
- }
目标组件为:
[html] view plain copy
- 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中注册:
[html] view plain copy
- <!-- 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:
[html] view plain copy
- http://localhost:8080/base-webapp/redirectsrc?username=New User
可以看到浏览器显示的结果如下:
该请求由两部分组成,第一部分的response中的返回状态码为302,并包含重定向的URL。
同时,浏览器显式的URL变为:
[html] view plain copy
- http://localhost:8080/base-webapp/redirectdest?msg=Hello,%20New%20User
在console中打印出的信息为:
[html] view plain copy
- 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”,请求访问源组件将指向这个网页。
转载自https://blog.csdn.net/robinjwong/article/details/39755509
文章最后发布于: 2018-04-16 17:43:43
相关阅读
Javaweb-HttpServletResponse的sendRedirectch重定向
一 、sendRedirect 1.1 重定向过程: 当使用HttpServletResponse的sendRedirect()时会发生重定向时,服务器会在Servlet中设置HTT
转自:http://www.newasp.net/tech/53042.html首先我们要明白用response.sendRedirect做转向的原理,它其实是向浏览器发送一个特殊的
Servlet转发和重定向response.sendRedirecte()区别
转发(forward):IE浏览器地址不会改变,始终是同一个请求。重定向(sendRedirect): IE浏览器地址会改变,用两个请求。1)转发 a)地址栏不
response.sendRedirect页面跳转无效,原因是在于ajax请
项目想要在后台进行页面跳转,用了response.sendRedirect,但是没反应,debug了一下,发现执行到重定向的时候没反应,当时就是一脸懵逼的,怎