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>