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.
您的过滤器包括您的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进行基准测试。 但是,每次发送请求时,我都希望从请求列表中获取请求(随机或循环,我不在乎)。 我不知道该怎么对付加特林。使用以下代码,请求被随机选择一次,同一请求被反复发送。这不是我想要的 我的代码: