SpringMVC中的转发和重定向

来源:互联网 发布:java 缺省修饰符 编辑:程序博客网 时间:2024/05/16 19:04

SpringMVC中的转发和重定向

1. 转发和重定向异同

​ 区别一:
重定向时浏览器上的网址改变
转发时浏览器上的网址不变

​ 区别二:
重定向实际上产生了两次请求(速度慢)
转发只有一次请求(速度快)

​ 重定向:
发送请求 –>服务器运行–>响应请求,返回给浏览器一个新的地址与响应码–>浏览器根据响应码,判定该响应为重定向,自动发送一个新的请求给服务器,请求地址为之前返回的地址–>服务器运行–>响应请求给浏览器
​ 转发:(只在服务器端执行)
发送请求 –>服务器运行–>进行请求的重新设置,例如通过request.setAttribute(name,value)–>根据转发的地址,获取该地址的网页–>响应请求给浏览器

​ 重定向:以前的request中存放的变量全部失效,并进入一个新的request作用域。
​ 转发:以前的request中存放的变量不会失效,就像把两个页面拼到了一起。

​ 区别三:
重定向时的网址可以是任何网址
转发的网址必须是本站点的网址

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

2. Controller中可以方便的通过forward , redirect 前缀来达到转发到其它资源的目的

如下代码中,在doLigin方法中转发到了userHome这个url, 转发后,request作用域还是同一个,数据也都还存在,userHome.jsp页面正常显示${username}, 而且url并没有变化。如果把forward改成redirect,则request中的数据超出作用于无法取得。

package cn.com.susq.controller;import org.apache.log4j.Logger;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.servlet.ModelAndView;import javax.annotation.Resource;import javax.servlet.http.HttpServletRequest;import java.io.UnsupportedEncodingException;/** * Created by susq on 2017-5-15. */@Controllerpublic class LoginController {    private static Logger logger = Logger.getLogger(LoginController.class);    @Resource    HttpServletRequest request;    @RequestMapping("/loginPage")    public String toLoginPage() {        return "login";    }    @RequestMapping("/userHome")    public ModelAndView toUserHome(HttpServletRequest request) {        logger.info("username in forward: " + request.getParameter("username"));        return new ModelAndView("userHome", "username", request.getParameter("username"));    }    @RequestMapping("/logout")    public String logout() {        request.getSession().removeAttribute("user");        return "redirect:/";    }    @RequestMapping("/doLogin")    public String doLogin(HttpServletRequest request) {        try {            request.setCharacterEncoding("utf-8");        } catch (UnsupportedEncodingException e) {            e.printStackTrace();        }        logger.info("username: " + request.getParameter("username"));        logger.info("password: " + request.getParameter("password"));        try {            if(request.getParameter("username").equals("张三") && request.getParameter("password").equals("123")) {                request.getSession().setAttribute("user", "张三");                return "forward:/userHome";            } else {                logger.info("没登录上");                return "/loginPage";            }        } catch (Exception e) {            return "/loginPage";        }    }}

forward:
这里写图片描述
redirect:
这里写图片描述
jsp文件如下

login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %><%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><body><form action="/doLogin" method="post">    用户名:<input type="text" name="username" /><br>    密码:<input type="text" name="password" /><br>    <input type="submit" value="登录" /></form></body></html>

userHome.jsp

<%@ page isELIgnored="false"%><%@taglib uri="http://www.springframework.org/tags" prefix="spring" %><%@taglib uri="http://www.springframework.org/tags/form" prefix="form" %><%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head>    <title>My JSP 'hello.jsp' starting page</title></head><body>当前用户:${username}<c:if test="${username!=null}">    <a href="/logout">退出</a></c:if>${message}</body></html>
原创粉丝点击