当前位置: 首页 > 知识库问答 >
问题:

在随请求分派器转发的servlet中使用sendRedirect

冉丰茂
2023-03-14
servletContext
    .getRequestDispatcher( uriDispatcherLocator.getServletLocation( uri ) )
    .include( request, response );

和下面的代码来包含JSP(在同一个过滤器中):

servletContext
    .getRequestDispatcher( "/index.jsp" )
    .include( request, response );

一切工作正常,servlet执行,然后它包括JSP,并且发生一些不相关的自定义规则。正如您所看到的,当我包含一个带有请求分派器的servlet时,我不能向客户机发送http头响应。问题是,我希望servlet完全控制响应,就像是从过滤器内部调用一样(因为过滤器除了根据servlet在项目文件系统中各自的类/JSP位置来映射servlet之外,什么也不做)。我可以使用.forward()而不是.include(),但是如果我这样做,我将无法在servlet执行后包含JSP。

那么,当通过RequestDispatcher接口通过过滤器包含servlet时,如何允许servlet执行下面的代码呢?

response.sendRedirect( "/somePath" );

编辑:换句话说:

我想通过使用RequestDispatcher更改从包含的servlet内部发送给客户机的头,但是文档声明:

The included servlet cannot change the response status code or set headers; any attempt to make a change is ignored.

共有1个答案

扈运浩
2023-03-14

您的过滤器包括您的servlet

servletContext
    .getRequestDispatcher( uriDispatcherLocator.getServletLocation( uri ) )
    .include( request, response );


Servlet指示要重定向

request.setAttribute ("sendRedirect", "/some/path");


或,希望添加一个或多个响应标头

Map<String, String> respHeaders = new HashMap<String, String>();
respHeaders.put("Expires", "0");
respHeaders.put("Cache-Control", "no-cache");
request.setAttribute("respHeaders", respHeaders);


筛选器检查这些特殊请求

Map<String, String> respHeaders =
                   (Map<String, String>) request.getAttribute("respHeaders");
for (String key : respHeaders.keySet()) {
    response.setHeader(key, respHeaders.get(key)); // set response headers
}

String sendRedirect;
if ((sendRedirect = (String) request.getAttribute("sendRedirect")) != null) {
    response.sendRedirect(sendRedirect); // redirect the client
}


edit:当从include外部调用时,您的一些servlet可能已经在驱动流并设置响应头。但是,没有办法按原样重用它们。您不能简单地包含它们并期待相同的行为,因为RequestDispatcher#include()的目标是只提供服务器端包含(SSI)。

因此,我们在API中没有发现任何重载方法(或任何可以修改此行为的setter)。如果您想要包含这样的servlet并保留它们的行为(比如重定向),您必须向它们传递一个提示,表明它们正在include上下文中运行,因此应该提交它们的响应请求。

request.setAttribute ("includeContext", true);
 类似资料:
  • 主要内容:请求转发,request 域对象,示例Web 应用在处理客户端的请求时,经常需要多个 Web 资源共同协作才能生成响应结果。但由于 Serlvet 对象无法直接调用其他 Servlet 的 service() 方法,所以 Servlet 规范提供了 2 种解决方案: 请求转发 请求包含(了解即可) 下面我们主要对请求转发进行介绍。 请求转发 请求转发属于服务器行为。容器接收请求后,Servlet 会先对请求做一些预处理,然后将请求传递

  • 编辑-过滤器用于缓存响应。我需要缓存AJAXHandler转发到的各个servlet的响应,而不是AJAXHandler本身最终返回的捆绑响应。

  • 如果任何< code>J2EE应用程序直接命中servlet,然后servlet将相同的请求转发给某个< code >。jsp页面。 我有一个带有以下url模式的servlet过滤器 因此,转发的请求是否也会进行过滤。 在我的情况下,它不会到来,这是一个预期的行为。只是想了解这一点。

  • 我有一个小应用程序(HTML表单、servlet作为控制器和jsp文件),我试图弄清楚为什么我不能将请求从servlet转发到jsp文件。 问题是从html提交后,显示“HTTP状态404” null 谢谢! 项目层次结构:http://s23.postimg.org/kgt7r7lwb/capture.jpg main.html: 更新:问题可能出在Controller.java。当我尝试下面的

  • 我有一个文件,其中包含Json请求体。我想使用constantUsersPerSec(...)对每秒发送恒定数量请求的Web进行基准测试。 但是,每次发送请求时,我都希望从请求列表中获取请求(随机或循环,我不在乎)。 我不知道该怎么对付加特林。使用以下代码,请求被随机选择一次,同一请求被反复发送。这不是我想要的 我的代码: