java response.sendredirect_「response.sendredirect」HttpServeltResponse接口中sendRedirect方法详解 - seo实验室...

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 copyjavax.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()调用后面的代码也会被执行源组件和目标组件不共享同一个Servletrequest对象,因此不共享请求范围内的共享数据对于response.sendredirect(String location)方法中的参数location,如果不以“/”开头,表示相对于当前源组件的路径;如果以“/”开头,表示相对于当前服务器根路径的URL,如果以“http://”开头,表示一个完整的internet上的路径;目标组件不必是同一个服务器上的同一个Web应用的组件,它可以是Internet上的任意一个有效的网页

示例:

创建一个源组件,在其中将请求转发给另一个组件:

[html] view plain copypackage 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 copypackage 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

redirectsrc

com.gof.test.servlet.RedirectSourceServlet

redirectsrc

/redirectsrc

redirectdest

com.gof.test.servlet.RedirectDestinationServlet

redirectdest

/redirectdest

在浏览器中请求如下URL:

[html] view plain copyhttp://localhost:8080/base-webapp/redirectsrc?username=New User

可以看到浏览器显示的结果如下:

4d6e143dbc1b8c589ed1f564d4086c9b.png

该请求由两部分组成,第一部分的response中的返回状态码为302,并包含重定向的URL。

同时,浏览器显式的URL变为:

[html] view plain copyhttp://localhost:8080/base-webapp/redirectdest?msg=Hello,%20New%20User

在console中打印出的信息为:

[html] view plain copyOutput 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

相关阅读

一 、sendRedirect

1.1 重定向过程:

当使用HttpServletResponse的sendRedirect()时会发生重定向时,服务器会在Servlet中设置HTT

转自:http://www.newasp.net/tech/53042.html首先我们要明白用response.sendRedirect做转向的原理,它其实是向浏览器发送一个特殊的

转发(forward):IE浏览器地址不会改变,始终是同一个请求。重定向(sendRedirect): IE浏览器地址会改变,用两个请求。1)转发a)地址栏不

项目想要在后台进行页面跳转,用了response.sendRedirect,但是没反应,debug了一下,发现执行到重定向的时候没反应,当时就是一脸懵逼的,怎

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值