【问题标题】:Java servlet filter lost format info, how to fix it?Java servlet过滤器丢失格式信息,如何解决?
【发布时间】:2014-07-31 07:28:33
【问题描述】:

我有一个 servlet 过滤器,如下所示:

public class ServletFilter implements Filter
{
  String Token="";

  public void init(FilterConfig filterConfig) throws ServletException { }

  public void doFilter(ServletRequest servletRequest,ServletResponse servletResponse,FilterChain filterChain) throws IOException,ServletException
  {
    HttpServletRequest request=(HttpServletRequest)servletRequest;
    HttpServletResponse response=(HttpServletResponse)servletResponse;

    response.getWriter().write("Request intercepted ...\n<P>\n");   
    Token=request.getParameter("token");
    if (Token==null || Token.trim().length()<1)
    {
      filterChain.doFilter(request,response);
//      filterChain.doFilter(servletRequest,servletResponse);
      return;
    }
  }
  ...
}

过滤后无法正常显示Html格式,如下图所示,上半部分是过滤前的样子,下半部分是过滤后的样子,为什么 ?如何解决?

【问题讨论】:

  • 如何在浏览器中查看源代码而不是屏幕截图并查看 HTML
  • 检查注释掉 response.getWriter().write("Request intercepted ...\n&lt;P&gt;\n"); 是否能解决问题。可能是这个字符串弄乱了格式,或者如果目标请求处理程序尝试执行“response.getOutputStream()”,那么请求可能会失败。

标签: java html servlets format filtering


【解决方案1】:

对于 Servlet 过滤器,您的使用模式不正确,或者至少不安全。

例如,假设您的拦截过滤器在过滤器列表中首先运行。它做的第一件事就是在响应中调用getWriter

  1. 一旦发出对getWriter 的调用,servlet 容器就可以立即开始刷新响应的 HTTP 标头。因此,您尚未设置的任何标题(例如内容类型)都将被忽略。如果您实际输出 HTML 内容,那就太糟糕了。
  2. 一旦发出对getWriter 的调用,如果没有IllegalStateException(根据javadoc),您(可能)调用的链的其余部分就不能调用getOutputStream。你最好确定你在做什么,包括你以后可能使用的任何框架是如何做的,以确保没有人在更远的地方调用getOutputStream
  3. 您开始在过滤器中编写(看起来像)HTML 内容。但是没有人写过文件的开头! ( ... )。因此,您很可能正在创建无效的 HTML 内容。

底线是:如果您要将请求转发到执行链的其余部分以呈现完整页。最有可能(也就是说:除非您确切地知道您要转发到什么,以及您来自哪里——这对于过滤器来说是一种反自然,您通常希望它们不依赖于其他过滤器),您将结束创建格式错误的内容,或者更糟糕的是,将您的 ServletResponse 置于 IllegalState 中。

不过,你可以做一些事情。例如向您的 HTTP 响应添加标头、添加 cookie、登录到服务器端控制台、设置稍后可以使用的请求/会话参数(在您的 JSP 中?)以稍后显示“请求截获”字符串的内容阶段。

【讨论】:

    猜你喜欢
    • 2018-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-11
    • 2017-12-22
    • 2015-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多