Java
中連接跳轉(zhuǎn)的2中方式Redirect
和Forward
- (重定向)
Redirect
重定向是把request 直接轉(zhuǎn)到其他組件處理,response.sendRedirect()后,response已經(jīng)提交休溶,不能再對(duì)response操作。
一個(gè)簡單的重定向
response.sendRedirect("redirect");
這個(gè)應(yīng)該和下面的代碼一樣的效果:
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
瀏覽器手動(dòng)302后逾条,對(duì) redirect發(fā)起請(qǐng)求君账,一個(gè)重定向酝惧,瀏覽器發(fā)了2次請(qǐng)求区端。
默認(rèn)的response.sendRedirect
返回的是302值漫,即使我在上面設(shè)置status code最后也返回302。(Tomcat 8.5中測試)
如果想返回301织盼,只能手動(dòng)設(shè)置了:
response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
String newLocn = request.getServletContext().getContextPath()+"/redirect";
response.setHeader("Location",newLocn);
301和302的區(qū)別:
301是永久性的杨何,302是臨時(shí)性的,301對(duì)爬蟲有作用沥邻,爬蟲對(duì)301直接更新原來的url危虱。
- (轉(zhuǎn)發(fā))
Forward
轉(zhuǎn)發(fā)是把請(qǐng)求的內(nèi)容直接寫到當(dāng)前的response
里面,不會(huì)要求瀏覽器重新發(fā)request
唐全。
request.getRequestDispatcher("/redirect").forward(request, response);