Java
中连接跳转的2中方式Redirect
和Forward
- (重定向)
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);