gpt4 book ai didi

Java servlet 过滤器丢失格式信息,如何修复?

转载 作者:行者123 更新时间:2023-12-01 12:41:36 28 4
gpt4 key购买 nike

我有一个 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格式,从下面的截图可以看出,上半部分是过滤前的样子,下半部分是过滤后的样子,为什么 ?如何解决?

enter image description here

最佳答案

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

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

  1. 一旦发出对 getWriter 的调用,servlet 容器就可以立即开始刷新响应的 HTTP header 。因此,您尚未设置的任何 header (例如内容类型)都将被忽略。如果您实际输出 HTML 内容,这将非常糟糕。
  2. 一旦发出对 getWriter 的调用,您(可能)调用的链的其余部分将无法在没有 IllegalStateException 的情况下调用 getOutputStream (根据 javadoc)。您最好确定您所做的事情,包括您将来可能使用的任何框架的作用,以确保没有人会沿着链更远的地方调用 getOutputStream !
  3. 您开始在过滤器中编写(看起来像)HTML 内容。但很可能没有人写过文档的开头! (...)。因此您可能正在创建无效的 HTML 内容。

底线是:如果您要将请求转发到执行链的其余部分以呈现完整的内容,则不应使用 servlet 过滤器来编写“正文级别”HTML(或实际上许多类型的内容)内容。页。最有可能的是(也就是说:除非您确切地知道您要转发的内容以及您来自哪里 - 这对于过滤器来说是一种反性质,您通常希望它们不依赖于其他过滤器),您将结束创建格式错误的内容,或者更糟糕的是,将您的 ServletResponse 置于 IllegalState 中。

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

关于Java servlet 过滤器丢失格式信息,如何修复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25048238/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com