Javaweb-HttpServletResponse的sendRedirectch重定向

本文对比分析了HTTPServletResponse的sendRedirect()与RequestDispatcher的forward()的不同之处,包括资源访问限制、URL变化及共享属性设置等方面。

一 、sendRedirect

1.1 重定向过程:

当使用HttpServletResponse的sendRedirect()时会发生重定向时,服务器会在Servlet中设置HTTP状态码为301以及Location标头返回给浏览器,浏览器收到这个标头以后会再一次使用GET方法请求重定向的URL,因此地址栏的URL会发生变化。

1.2 sendRedirect使用方法
response.sendRedirect(URL url);

二实验

2.1使用sendRedirect()进行重定向,同时使用HttpServletRequest中的setAttribute进行属性设置

在浏览器中输入http://localhost:8088/send_redirect.html
send_redirect.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/send_redirect" method="post">
    Name:<input type="text" name="name"/><br/>
    Submit:<input type="submit" value="Submit By Post"/>
</form>
</body>
</html>

在网页的Name这一栏输入Zoubaitao
这里写图片描述
点击Submit By Post,浏览器的地址栏会变成http://localhost:8088/send_redirect
服务器根据”/send_redirect”就会去服务器的web.xml找到对应的url-pattern最后找到对应的Servlet来处理;或者是根据@WebServlet来查找对应的Servlet;

SendRedirectServlet.java

package httpservletresponse;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/send_redirect")
public class SendRedirectServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        doPost(request,response);
    }
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
        request.setCharacterEncoding("UTF-8");
        String name = request.getParameter("name");
        response.setContentType("text/html");
        request.setAttribute("name",name);
        //setAttribute("name",name);
        response.sendRedirect("http://localhost:8088/welcome.jsp");
    }
}

welcome.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    Welcome<br/>
    ${name}
</body>
</html>

最后输出的结果为
这里写图片描述
结果分析:我们发现我们在request中设置的name属性并没有传递到welcome的request对象中。而welcome.jsp中的request对象不存在一个name 属性值,所以不输出

2.1使用sendRedirect()进行重定向,同时使用HttpServletRequest中的setAttribute进行属性设置

在浏览器中输入http://localhost:8088/send_redirect.html
send_redirect.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/send_redirect" method="post">
    Name:<input type="text" name="name"/><br/>
    Submit:<input type="submit" value="Submit By Post"/>
</form>
</body>
</html>

在网页的Name这一栏输入Yanzi
这里写图片描述
点击Submit By Post,浏览器的地址栏会变成http://localhost:8088/send_redirect
服务器根据”/send_redirect”就会去服务器的web.xml找到对应的url-pattern最后找到对应的Servlet来处理;或者是根据@WebServlet来查找对应的Servlet;

SendRedirectServlet.java

package httpservletresponse;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/send_redirect")
public class SendRedirectServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        doPost(request,response);
    }
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
        request.setCharacterEncoding("UTF-8");
        String name = request.getParameter("name");
        response.setContentType("text/html");
        this.getServletContext.setAttribute("name",name);
        //setAttribute("name",name);
        response.sendRedirect("http://localhost:8088/welcome.jsp");
    }
}

welcome.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    Welcome<br/>
    ${name}
</body>
</html>

结果输出
这里写图片描述
结果分析:我们通过ServletContext来设置的属性,最后能够在重定向的welcome.jsp中得到这个属性值,最终输出在浏览器上。因此如果我们需要在重定向的时候设置共享的变量,那么我们需要使用的ServletContext来设置属性。同时我们可以看到URL地址栏变成了我们设置的重定向的地址

2.3使用sendRedirect()进行重定向,但是我们重定向的资源放在WEB-INF文件夹下

在浏览器中输入http://localhost:8088/send_redirect.html
send_redirect.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/send_redirect" method="post">
    Name:<input type="text" name="name"/><br/>
    Submit:<input type="submit" value="Submit By Post"/>
</form>
</body>
</html>

在网页的Name这一栏输入Yanzi
这里写图片描述
点击Submit By Post,浏览器的地址栏会变成http://localhost:8088/send_redirect
服务器根据”/send_redirect”就会去服务器的web.xml找到对应的url-pattern最后找到对应的Servlet来处理;或者是根据@WebServlet来查找对应的Servlet;

SendRedirectServlet.java

package httpservletresponse;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/send_redirect")
public class SendRedirectServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        doPost(request,response);
    }
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
        request.setCharacterEncoding("UTF-8");
        String name = request.getParameter("name");
        response.setContentType("text/html");
        this.getServletContext.setAttribute("name",name);
        //资源路径为WEB-INF文件夹下
        response.sendRedirect("http://localhost:8088/WEB-INF/welcome.jsp");
    }
}

welcome.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    Welcome<br/>
    ${name}
</body>
</html>

结果输出
这里写图片描述
结果分析:我们将我们重定向的资源放在了WEB-INF文件夹下,所以浏览器是无法访问到的。这是重定向和转发之间的一个不同点,转发有服务器自己处理转发请求,但是重定向是浏览器对重定向的资源再一次进行请求。这从请求次数上,转发只请求一次,但是重定向至少请求两次。

三、总结

RequestDispatcher的forward()和HttPServletResponse的sendRedirect()之间的不同

1) foward()就可以访问WEB-INF文件夹下的资源,而sendRedirect()不能重定向在WEB-INF文件夹下的资源
2) forward()进行转发时是服务器内部进行处理,因此浏览器不知道发生的变化,所以浏览器的URL不会发生变化,而sendRedirect()会发生变 换,是因为浏览器会从服务器得到301状态码以后会再一次按照重定向的URL以get的方式请求服务器。所以服务器地址栏的URL发生变化
3) forward()可以通过HttpServletRequest的setAttribute()和ServletContex的setAttribute()设置共享属性。而sendRedirect()只能通过ServletContext()的setAttribute()进行访问属性(其实二者另外还都可以使用Session来存储共享的数据)
<think>首先,用户的问题是:“我想了解JavaWeb中转发和重定向的区别 请问JavaWeb中转发和重定向的区别”。这是一个明确的查询,基于提供的引用,我需要总结转发和重定向的区别。 根据系统指令: - 所有行内数学表达式必须使用$...$格式;但这个问题是关于JavaWeb的,所以不会有数学内容,可能不需要数学表达式。 - 独立公式必须使用$$...$$格式;同样,不适用。 - LaTeX语法正确:确保任何格式化正确。 - 使用中文回答:整个回答必须用中文。 - 生成相关问题:在回答末尾生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如:[^1]。所以,我需要引用提供的引用源。 提供的引用: - [^1]: 转发和重定向的区别,重点在request域共享和请求次数。 - [^2]: 请求次数:转发一次请求,重定向两次;转发共用request和response,可以传递参数;重定向不能传递参数;浏览器地址变化。 - [^3]: 重定向方法示例。 - [^4]: 转发和重定向的特点;转发使用request对象。 - [^5]: 转发方法示例。 关键点总结: - **请求次数**:转发是服务器内部处理,只一次请求;重定向是客户端响应新URL,两次请求。 - **共享数据**:转发时,request和response对象是共享的,可以通过request传递属性(如request.setAttribute)。重定向时,因为是新的请求,request对象是不同的,不能共享数据。 - **浏览器地址**:转发浏览器地址不变;重定向浏览器地址改变。 - **用法**:如果需要在servlet间共享数据,用转发;否则,用重定向,因为它更安全(避免重复提交)。 - 引用[^1]提到:如果request域有数据,用转发;其他情况用重定向。 回答结构: - 需要结构清晰,逐步解决问题。 - 开头简要介绍转发和重定向- 然后列出主要区别点。 - 自然地添加引用。 - 最后生成相关问题。 引用标识: - 在回答中,当提到某个点时,自然地添加引用,如“根据引用[^1]”。 - 引用源是[^1]到[^5]。 完整回答结构: 1. **介绍**:简述转发和重定向。 2. **主要区别**: - 请求次数 - 数据共享 - 浏览器地址变化 - 性能和安全 3. **示例或代码片段**:可能添加简短代码,如从引用[^3]或[^5]。 4. **总结**:何时使用。 5. **相关问题**:生成3个相关问题。 确保回答真实可靠:基于提供的引用,不要添加未引用信息。 生成相关问题: - 如系统指令示例:“§§相关问题§§” - 例如:1. 如何在JavaWeb中实现转发?2. 重定向有什么缺点?3. 如何处理数据传递在重定向中? 最终输出: - 用中文。 - 结尾有相关问题。 </think>### JavaWeb中转发与重定向的区别 在JavaWeb开发中,“转发”(Forward)和“重定向”(Redirect)是两种常用的请求处理机制,主要用于在Servlet或JSP页面间跳转。以下是它们的核心区别,基于引用资料总结: 1. **请求次数不同** - **转发**:只涉及**一次请求**和**一次响应**。客户端发送请求后,服务器内部直接将请求转发给另一个资源(如Servlet或JSP),客户端感知不到该过程。 - **重定向**:涉及**两次请求**和**两次响应**。服务器先向客户端发送一个302状态码和新的URL,客户端再自动发起新请求到该URL。 (引用[^1]和[^2]强调了转发是“一次请求”,重定向是“俩次请求”。) 2. **数据共享能力不同** - **转发**:使用相同的`HttpServletRequest`和`HttpServletResponse`对象,因此可以在request域中共享数据(例如通过`request.setAttribute()`设置属性,在下一个资源中通过`request.getAttribute()`获取)。 - **重定向**:每次请求是独立的,request对象不共享,因此**无法通过request传递数据**。如果需要传递参数,需手动附加到URL(如`sendRedirect("/new?param=value")`)。 (引用[^1]指出:如果上一个Servlet绑定了数据到request域,必须用转发才能在下个Servlet取出;引用[^2]明确重定向不能使用response传递参数。) 3. **浏览器地址栏变化** - **转发**:浏览器地址栏**不会改变**,显示的是原始请求的URL- **重定向**:浏览器地址栏**会更新为新的URL**。 (引用[^2]和[^4]对比了这一点,转发“浏览器地址不会变”,重定向“会改变浏览器地址”。) 4. **实现方式与性能** - **转发**:通过`RequestDispatcher`接口实现,例如: ```java req.getRequestDispatcher("target.jsp").forward(req, resp); // 示例代码[^4] ``` 性能较高(仅一次服务器处理),但安全风险略高(可能导致表单重复提交)。 - **重定向**:通过`HttpServletResponse`的`sendRedirect()`方法实现,例如: ```java resp.sendRedirect("/new-page"); // 示例代码[^3] ``` 性能较低(两次网络交互),但更安全(避免重复操作)。 (引用[^3]和[^5]提供了具体代码示例。) 5. **适用场景建议** - **优先转发**:当需要在资源间**共享request域数据**时(如表单处理)。 - **优先重定向**:在**其他所有情况**,如登录后跳转或防止重复提交(引用[^1]建议:“如果在上一个Servlet当中向request域当中绑定了数据,使用转发机制。剩下所有的请求均使用重定向。”引用[^4]也强调了重定向使用较多)。 总结来说,转发适用于服务器内部高效的数据传递,而重定向更适合客户端级别的导航和安全性要求较高的场景。开发者应根据数据共享需求和安全性权衡选择。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值