SpringMVC中的转发和重定向

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.
 */
@Controller
public 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>
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值