Java 中Redirect和Forward

Java中连接跳转的2中方式RedirectForward

  • (重定向)Redirect

重定向是把request 直接转到其他组件处理,response.sendRedirect()后,response已经提交,不能再对response操作。
一个简单的重定向

response.sendRedirect("redirect");

这个应该和下面的代码一样的效果:

        response.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY);
        String newLocn = request.getServletContext().getContextPath()+"/redirect";
        response.setHeader("Location",newLocn);

查看header:

http://localhost:7080/test/testd

GET /test/testd HTTP/1.1
Host: localhost:7080
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Upgrade-Insecure-Requests: 1

 HTTP/1.1 302
Location: redirect
Content-Length: 0
Date: Mon, 26 Jun 2017 09:15:23 GMT

浏览器手动302后,对 redirect发起请求,一个重定向,浏览器发了2次请求。
默认的response.sendRedirect返回的是302,即使我在上面设置status code最后也返回302。(Tomcat 8.5中测试)
如果想返回301,只能手动设置了:

        response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
        String newLocn = request.getServletContext().getContextPath()+"/redirect";
        response.setHeader("Location",newLocn);

301和302的区别:
301是永久性的,302是临时性的,301对爬虫有作用,爬虫对301直接更新原来的url。

  • (转发)Forward

转发是把请求的内容直接写到当前的response里面,不会要求浏览器重新发request

request.getRequestDispatcher("/redirect").forward(request, response);

推荐阅读更多精彩内容