提示:以下是本篇文章正文内容,Java系列学习将会持续更新
一、重定向 (redirect)
重定向,即response.sendRedirect()
,是一种客户端行文,从本质上讲等同于两次请求,前一次请求对象不会保存,地址栏的URL地址会改变。在重定向的过程中,传输的信息会被丢失。
当我去请求一个资源的时候,我可以要求浏览器去请求另一个资源。即:301永久性重定向和302临时性重定向。
永久重定向:
页面永久性移走(301重定向)是一种非常重要的 “自动转向” 技术。
301重定向可促进搜索引擎优化效果。
从搜索引擎优化角度出发,301重定向是网址重定向最为可行的一种办法。当网站的域名发生变更后,搜索引擎只对新网址进行索引,同时又会把旧地址下原有的外部链接如数转移到新地址下,从而不会让网站的排名因为网址变更而收到丝毫影响。同样,在使用301永久性重定向命令让多个域名指向网站主域时,亦不会对网站的排名产生任何负面影响。
临时重定向:
用 GET 和 POST 两种请求方法:
<!DOCTYPE html>
<html lang="zh-hans">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form method="get" action="/redirect">
<button>提交</button>
</form>
</body>
</html>
测试重定向时用哪种方法:
@WebServlet("/redirect")
public class Redirect extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
redirect(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
redirect(req, resp);
}
private void redirect(HttpServletRequest req, HttpServletResponse resp) {
resp.setStatus(307);
resp.setHeader("Location", "/target"); // 由于没有实现,结果会是 404
// 看看重定向时到底是哪种方法?
}
}
结论:
状态码 | 效果 |
---|---|
302 | GET和POST方法都可以重定向 |
303 | 退化成GET请求重定向 |
307 | 保留原方法。使用GET/POST,要看原方法是哪种 |
二、请求转发 (forword)
请求转发,即request.getRequestDispatcher().forward()
,是一种服务器的内部行为,客户端只有一次请求,服务器端转发后会将请求对象保存,地址栏中的URL地址不会改变,得到响应后服务器端再将响应发给客户端。传输的信息不会丢失。
@WebServlet("/resource-1")
public class Resource1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("resource 1 下的 get 方法");
// resp.sendRedirect("/resource-2"); // 重定向
// 请求转发
req.getRequestDispatcher("/resource-2").forward(req, resp);
}
}
总结:
提示:这里对文章进行总结:
以上就是今天的学习内容,本文是JavaWeb的学习,认识了重定向和请求转发,重定向是HTTP的行为,做了两次请求;而转发是Servlet内部行为,对于客户端来说只做了一次请求。之后的学习内容将持续更新!!!
本文含有隐藏内容,请 开通VIP 后查看