转发(forward)和重定向(redirect)

转发和重定向

参考:http://www.2cto.com/kf/201107/97118.html

以前写的一个注册页面:

 1 package com.ifly.bbs.controller;
 2
 3 import java.io.IOException;
 4
 5 import javax.servlet.ServletException;
 6 import javax.servlet.annotation.WebServlet;
 7 import javax.servlet.http.HttpServlet;
 8 import javax.servlet.http.HttpServletRequest;
 9 import javax.servlet.http.HttpServletResponse;
10
11 import com.ifly.bbs.pojo.User;
12 import com.ifly.bbs.service.UserService;
13 import com.ifly.bbs.service.impl.UserServiceImpl;
14
15 @WebServlet("/ZhuCe")
16 public class ZhuceController extends HttpServlet {
17     private static final long serialVersionUID = 1L;
18
19     protected void doGet(HttpServletRequest request,
20             HttpServletResponse response) throws ServletException, IOException {
21
22         request.getRequestDispatcher("/WEB-INF/view/ZhuCe.jsp").forward(
23                 request, response);
24     }
25
26     protected void doPost(HttpServletRequest request,
27             HttpServletResponse response) throws ServletException, IOException {
28
29         // 设置编码
30         request.setCharacterEncoding("UTF-8");
31         response.setCharacterEncoding("UTF-8");
32         response.setContentType("text/html;charset=UTF-8");
33
34         // 获取参数
35         String email = request.getParameter("email").trim();
36         String name = request.getParameter("name").trim();
37         String psw = request.getParameter("psw").trim();
38         String comfirmPsw = request.getParameter("comfirmPsw").trim();
39
40         //注册时判断两次输入的密码是否相同
41         if (!psw.equals(comfirmPsw)) {
42             // 注册失败,保存邮箱
43             request.setAttribute("email", email);
44
45             request.setAttribute("error", "两次密码不一致");
46             request.getRequestDispatcher("/WEB-INF/view/ZhuCe.jsp").forward(
47                     request, response);
48             return;
49         }
50
51         // 调用service代码
52         User user = new User();
53         user.setEmail(email);
54         user.setName(name);
55         user.setPassword(psw);
56
57         UserService us = new UserServiceImpl();
58         us.add(user);
59
60         // 重定向
61         response.sendRedirect(request.getContextPath() + "/Login");
62
63     }
64
65 }

转发:

request.getRequestDispatcher("zhuce.jsp").forward(request,response);//转发到zhuce.jsp

重定向:

response.sendRedirect("login.jsp");//重定向到login.jsp

MVC框架中是这样子的:

简单的说有两个明显的不同点:

forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发送给浏览器,浏览器根本不知道服务器发送的内容是从哪来的,所以它的地址栏中还是原来的地址。

redirect是服务器根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,可以在浏览器的地址栏中看到跳转后的地址,所以地址栏显示的是新的URL。


1.转发时浏览器上的网址不变

重定向时浏览器上的网址会发生变化

2.转发只有一次请求(request)

 重定向时实际上会产生两个请求

3.转发可以共享request里面的数据(以前的request中存放的变量不会失效,就像把两个页面拼到了一起。)

重定向不能共享数据(以前的request中存放的变量全部失效,并进入一个新的request作用域。)

4.forward效率高

redirect效率低

转发:

浏览器发送请求——>服务器运行——>进行请求的重新设置——>根据转发时的地址获取该地址的网页——>将请求相应给浏览器

重定向:

浏览器发送请求——>服务器运行——>相应请求,返回给浏览器一个状态码(一个新的地址)——>浏览器根据状态码判定响应为重定向,自动发送一个新的请求给服务器,请求是返回的新的地址——>服务器运行——>将请求相应给浏览器

时间: 2024-10-12 20:35:32

转发(forward)和重定向(redirect)的相关文章

spring 转发forward和重定向redirect

forward 转发,如return "forward:/hello"; 浏览器的地址栏不会变,但是有视图返回来 redirect 重定向,如return "redirect:/hello"; 浏览器的地址栏会变. 网络解释: spring控制器最后返回一个ModelAndView(urlName),其中urNamel可以是一个视图名称,由视图解析器负责解析后将响应流写回客户端;也可以通过redirect/forward:url方式转到另一个控制器进行处理. red

转发(Forward)和重定向(Redirect)的区别

转发是服务器行为,重定向是客户端行为. 转发(Forword) :通过RequestDispatcher对象的forward(HttpServletRequest request,HttpServletResponse response)方法实现的. RequestDispatcher 可以通过HttpServletRequest 的 getRequestDispatcher()方法获得.例如下面的代码就是跳转到 login_success.jsp 页面. request.getRequestD

直接请求转发(Forward)和间接请求转发(Redirect)两种区别?

用户向服务器发送了一次HTTP请求,该请求肯能会经过多个信息资源处理以后才返回给用户,各个信息资源使用请求转发机制相互转发请求,但是用户是感觉不到请求转发的.根据转发方式的不同,可以区分为直接请求转发(Forward)和间接请求转发(Redirect)两种有何区别呢?本篇在回答该问题的同时全面的讲解两种请求转发方式的原理和区别. [关键考点] 请求转发的含义: Forward转发请求的原理: Redirect转发请求的原理. [考题分析] Forward和Redirect代表了两种请求转发方式:

javaWeb中request请求转发和response重定向

1.访问资源 运用forward方法只能重定向到同一个Web应用程序中的一个资源. 而sendRedirect方法可以让你重定向到任何URL. 2.request.get Forward代码中的"/uu"则代表相对与WEB应用的路径. 举例: Servlet 和 目标文件的包路径: Servlet  代码:中 doPost 和doGet代码: request 重定向url地址 或者是是相对于 本项目 (WEB13)  http:localhost:8080/WEB13+url     

请求转发 和 URL 重定向

五 请求转发 和 URL 重定向 1 请求转发和重定向 干什么用? 是我们在java后台servlet中 由一个servlet跳转到 另一个 servlet/jsp 要使用的技术 前端发送请求到后台 : A 浏览器地址栏输入链接 B a标签 <a href="url地址">跳转</a> C form表单 <form action="url地址" method="get/post"> <input type

forward:hello 与 redirect:hello的区别

对于某些Controller的处理方法,当返回值为String类型时,返回的结果中可能含有forward或redirect前缀: 如: 1 @Controller 2 @RequestMapping("/user") 3 public class UserController { 4 @RequestMapping("/forward") 5 public String replyWithForward(HttpServletRequest request, Str

URL转发和301重定向的区别

URL转发和301重定向区别是什么?URL转发和301重定向对于搜索引擎和权重转移都一样吗?下面我们一起来分析下: 一.从用户体验角度分析 在用户角度上,URL转发和301重定向完全是一样的,没有任何区别. 二.从操作使用URL转发和301重定向角度分析 URL转发操作起来更加容易,而301重定向在IIS服务器上相对比较麻烦,而且虚拟主机用户无法操作,apache服务器也比较容易实现. 三.从搜索引擎爬行和权重转移角度分析 URL转发没有权重转移,所以对于权重转移的站点没有任何帮助,如果你的站点

Springmvc 在同一个controller和不同的controller中进行重定向redirect和转发forward:

redirect  forward 在同一个controller之间进行重定向:redirect 1.我们的请求在同一个controller之间进行重定向具体代码如下: 2.实例: 前台代码: <formaction="user/update.do" method="post"> id:<input type="text" name="id"> name:<input type="tex

请求转发与请求重定向

----请求重定向:客户端行为,response.sendRedirect(); 从本质上讲等同于两次请求,前一次的请求对象不会保存,地址栏的URL地址会改变. ----请求转发:服务器行为,request.getRequestDispatcher().forward(req,resp); 其本质是一次请求,转发后请求对象会保存在request中,地址栏URL地址不会改变.

Java Servlet(九):转发请求与重定向请求区别

转发: <% pageContext.setAttribute("pageContextAttr", "pageContextAttribute"); request.setAttribute("requestAttr", "requestAttribute"); session.setAttribute("sessionAttr", "sessionAttribute"); ap