Servlet的重定向与转发

Redirect(重定向)
重定向是指当浏览器请求一个URL时,服务器返回一个重定向指令,告诉浏览器地址已经变了,使用新的URL再重新发送新请求。
例如:我们已经编写了一个能处理/firstFirstServlet,如果收到的路径为/first,希望能重定向到/second,可以再编写一个SecondServlet

@WebServlet("/first")
public class FirstServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String name = req.getParameter("name");
        resp.sendRedirect("/second"+(name==null?"":"?name="+name));
    }
}

如果浏览器发送GET /hi请求,RedirectServlet将处理此请求。由于RedirectServlet在内部又发送了重定向响应,因此,浏览器会收到如下响应:

HTTP/1.1 302 Found
Location: /hello

当浏览器收到302响应后,它会立刻根据Location的指示发送一个新的GET /hello请求,这个过程就是重定向:
┌───────┐ GET /hi ┌───────────────┐
│ Browser │ ────────────> │ RedirectServlet │
│ │ <──────────── │ │
└───────┘ 302 └───────────────┘

┌───────┐ GET /hello ┌───────────────┐
│ Browser │ ────────────> │ HelloServlet │
│ │ <──────────── │ │
└───────┘ 200 └───────────────┘
观察Chrome浏览器的网络请求,可以看到两次HTTP请求:
重定向有两种:一种是302响应,称为临时重定向,一种是301响应,称为永久重定向。两者的区别是,如果服务器发送301永久重定向响应,浏览器会缓存/hi/hello这个重定向的关联,下次请求/hi的时候,浏览器就直接发送/hello请求了。

重定向有什么作用?重定向的目的是当Web应用升级后,如果请求路径发生了变化,可以将原来的路径重定向到新路径,从而避免浏览器请求原路径找不到资源。

HttpServletResponse提供了快捷的redirect()方法实现302重定向。如果要实现301永久重定向,可以这么写:

resp.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY); // 301
resp.setHeader("Location", "/second");

Forward(转发)
Forward是指内部转发。当一个Servlet处理请求的时候,它可以决定自己不继续处理,而是转发给另一个Servlet处理。
例如,我们已经编写了一个能处理/firstFirstServlet,继续编写一个能处理/secondSecondServlet

@WebServlet("/first")
public class FirstServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.getRequestDispatcher("/second").forward(req,resp);
    }
}

FirstServlet在收到请求后,它并不自己发送响应,而是把请求和响应都转发给路径为/second的Servlet,即下面的代码:

req.getRequestDispatcher("/second").forward(req, resp);

后续请求的处理实际上是由HelloServlet完成的。这种处理方式称为转发(Forward),我们用流程图画出来如下:
┌───────────────────┐
│ ┌──────────────┐ │
│ ──>│ FirstServlet │ │
┌───────┐ GET /first │ └──────────────┘ │
│ Browser │ ──────── │ │ │
│ │ <─────── │ ▼ │
└───────┘ 200 │ ┌──────────────┐ │
│ <──│ SecondServlet │ │
│ └──────────────┘ │
│ Web Server │
└────────────────────┘
转发和重定向的区别在于,转发是在Web服务器内部完成的,对浏览器来说,它只发出了一个HTTP请求。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值