- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我是 servlet 的新手,正在阅读一些有关过滤器和包装器的文章。我能理解过滤器,但对包装器感到困惑。在书中,作者举了一个例子:
如果没有包装器:
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
String name = request.getParameter("name").trim();
try {
chain.doFilter(request, response);
PrintWriter out = response.getWriter();
if (name.length() == 0) {
out.println("Some message");
out.println("</body>");
out.println("</html>");
out.close();
}
} catch (Throwable t) {
}
}
如果是包装器:
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
String name = request.getParameter("name").trim();
HttpServletResponse httpRes = (HttpServletResponse) response;
HttpServletResponseWrapper resWrapper = new HttpServletResponseWrapper(httpRes);
try {
chain.doFilter(request, response);
PrintWriter out = resWrapper.getWriter(); // why dont we just use response.getWriter();
if (name.length() == 0) {
out.println("<h3>Some message");
out.println("</body>");
out.println("</html>");
out.close();
}
} catch (Throwable t) {
}
}
为什么我们需要 HttpServletResponseWrapper
而我们可以在情况 1 中使用 ServletResponse
做同样的事情?谁能给我一个明确的例子,说明我们必须使用 HttpServletResponseWrapper
而不是 ServletResponse
?我试过用谷歌搜索,但没有找到任何运气。
最佳答案
BalusC 的回答很好,但如果您刚开始,可能会有点不知所措。
简单地说:SerlvetResponse及其扩展名,HttpServletResponse , 是接口(interface)告诉你可以调用哪些方法来做你需要的事情。在使用过滤器、Servlet 等的正常过程中,您将经常使用 HttpServletResponse 来告诉您的应用程序如何响应请求。
HttpServletResponseWrapper是 HttpServletResponse 的一个特定实现,它为您提供了一种方便的方法来用您自己的一些逻辑包装现有的响应,而无需编写接口(interface)的全新实现。它有很多方法,所以这真的很棒。作为一个简单的例子,假设您想禁止调用 response.flushBuffer() .此代码使用 HttpServletResponseWrapper,将执行此操作:
class DisallowFlushResponseWrapper extends HttpServletResponseWrapper {
public DisallowFlushResponseWrapper(HttpServletResponse response) {
super(response);
}
@Override
public void flushBuffer() {
throw new UnsupportedOperationException("Don't call this!");
}
}
使用此类包装器的典型方法是创建如下过滤器:
class DisallowFlushFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) {
if (response instanceof HttpServletResponse) {
HttpServletResponse newResponse =
new DisallowFlushResponseWrapper((HttpServletResponse) response);
chain.doFilter(request, newResponse);
}
...
}
...
}
请注意,我们使用我们自己的包装器实例包装进入过滤器的响应。然后我们将包装器传递给过滤器链中的下一个项目。因此,如果调用 flushBuffer(),此过滤器之后的任何内容都会出现异常,因为它将在我们的包装器上调用它。由于其默认行为,包装器会将任何其他调用委托(delegate)给包装的响应,这是真实的响应,因此除了调用该方法之外的所有内容都将正常工作。
关于java - ServletResponse 和 HttpServletResponseWrapper 之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7023374/
这个问题已经有答案了: How to read and copy the HTTP servlet response output stream content for logging (6 个回答)
javax.servlet.Servlet有什么好的理由 void service(ServletRequest req, ServletResponse res) 方法将 ServletRespon
我正在使用 Tomcat。 ServletResponse.flushBuffer 的文档说,“强制将缓冲区中的任何内容写入客户端。调用此方法会自动提交响应,这意味着状态代码和 header 将是写的
如果我调用 ServletResponse.flushBuffer() , 我需要打电话吗 ServletResponse.getOutputStream().close() 和/或 ServletR
标题几乎不言自明,但始终检查 ServletResponse 类型的 isCommitted() 是否有值(value)?我的具体示例是使用过滤器,如果用户无权执行特定操作(具体为 CSRF 检查),
根据文档,ServletResponse 接口(interface)的setContentLength(int len) 方法设置响应中内容主体的长度 在 HTTP servlet 中,此方法设置HT
关于优化我为将 StringBuilder 的全部内容写入 ServletResponse 而创建的方法,我想获得一些意见。 我这样做是为了避免在将其传递给 out.write() 方法之前一次性创建
这个问题已经有答案了: How to mock void methods with Mockito (11 个回答) 已关闭 7 年前。 这是我的 servlet 代码: String foo = "
我是 servlet 的新手,正在阅读一些有关过滤器和包装器的文章。我能理解过滤器,但对包装器感到困惑。在书中,作者举了一个例子: 如果没有包装器: public void doFilter(Serv
我在 Tomcat 中并且有一个包含 JSP 内容的字符串。我尝试获取 HttpServletResponse 意味着 HTML 输出。在正常情况下,您调用 JSP,WebContainer 将其转换
我正在使用 ServletResponse.setBufferSize 增加响应的缓冲区大小,但 Tomcat 7 仍然抛出缓冲区大小不够大的异常。这是 Tomcat 7.0.32 中的错误吗? 这是
我想知道 ServletResponse.reset() 是否是我需要阻止未登录用户访问 servlet 的额外步骤,或者它是否存在风险或缺点。 背景: 方式my website有效,最初用户只能在创
我已经成功设置了 httpServletResponse().setHeader("custtype", "permanent") 但是当我尝试检索它时 httpServletResponse().g
我正在尝试报告从我的 web 应用返回的每个 HTTP 状态代码。但是,状态代码似乎无法通过 ServletResponse 访问,或者即使我将其转换为 HttpServletResponse。有没有
如何使用 JUnit 正确覆盖过滤器? @SlingFilter(order = -700, scope = SlingFilterScope.REQUEST) public class Loggin
为什么 Servlet 接口(interface)中的 service() 方法不返回 ServletResponse 的实例,而是在 ServletResponse 上工作 容器提供的对象? 简单来
这个问题已经有答案了: Should one call .close() on HttpServletResponse.getOutputStream()/.getWriter()? (6 个回答)
多年来我一直在编写 servlet 和过滤器,这一直让我有点厌烦 - 检查和转换 ServletRequest 和 ServletResponse 参数到 HttpServletRequest 和 H
我是一名优秀的程序员,十分优秀!