Servlet之重定向和请求转发

发布于:2023-01-17 ⋅ 阅读:(451) ⋅ 点赞:(0)


提示:以下是本篇文章正文内容,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 后查看

网站公告

今日签到

点亮在社区的每一天
去签到