Servlets 添加一个servlet过滤器,将请求包装到HttpServletRequestWrapper中,这似乎打破了这一页

Servlets 添加一个servlet过滤器,将请求包装到HttpServletRequestWrapper中,这似乎打破了这一页,servlets,osgi,servlet-filters,forwarding,equinox,Servlets,Osgi,Servlet Filters,Forwarding,Equinox,当请求被HttpServletRequestWrapper包装时,我在让servlet转发工作时遇到问题 这是一个服务器端equinox应用程序,在Eclipse中运行,使用嵌入式Jetty web服务器提供HttpService实现 要隔离问题,my field唯一要做的就是包装请求并将其转发: public class TestFilter implements Filter { public void doFilter(ServletRequest request, Servlet

当请求被HttpServletRequestWrapper包装时,我在让servlet转发工作时遇到问题

这是一个服务器端equinox应用程序,在Eclipse中运行,使用嵌入式Jetty web服务器提供HttpService实现

要隔离问题,my field唯一要做的就是包装请求并将其转发:

public class TestFilter implements Filter {
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        chain.doFilter(new HttpServletRequestWrapper((HttpServletRequest)request), response);
    }
    ...
}
…我的servlet除了尝试转发到JSP之外什么都不做:

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    RequestDispatcher dispatcher = request.getRequestDispatcher("/account.jsp");
    try {
        dispatcher.forward(request, response);

    } catch (Exception e) {
        e.printStackTrace();
    }

}
根据Servlet2.3规范,传递给forward方法的请求和响应对象可以是原始对象,也可以是所提供包装器的实例。我需要传递自定义包装,但当我传递时,转发失败,出现以下异常:

java.lang.StringIndexOutOfBoundsException: String index out of range: -1
    at java.lang.String.substring(Unknown Source)
    at org.eclipse.equinox.http.servlet.internal.ProxyServlet.service(ProxyServlet.java:64)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
    at org.eclipse.equinox.http.jetty.internal.HttpServerManager$InternalHttpServiceServlet.service(HttpServerManager.java:318)
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:390)
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
    at org.mortbay.jetty.servlet.Dispatcher.forward(Dispatcher.java:327)
    at org.mortbay.jetty.servlet.Dispatcher.forward(Dispatcher.java:126)
    at org.eclipse.equinox.http.servlet.internal.RequestDispatcherAdaptor.forward(RequestDispatcherAdaptor.java:30)
    at mypackage.internal.signup.PlatformSetupServlet.doPost(PlatformSetupServlet.java:53)
...
如果我拿走包装器并转发原始请求,servlet转发成功

这看起来像是org.eclipse.equinox.http.servlet实现中的一个bug,但我可能遗漏了一些东西

我做错什么了吗?

谢谢


Eduardo Born看起来ProxyServlet在解析请求信息时遇到了问题

找到ProxyServlet的源:


虽然它不完全匹配,但您可以从代码中看到,它试图从您的请求中提取路径信息,但它没有找到预期的“/”。您可以尝试调整servlet的路径,只是为了测试它?

这应该是由于ProxyServlet.service方法中的代码将-1传递给子字符串造成的。 但“转发”破坏代码的原因是“转发”不会创建一个全新的包装层次结构。相反,它会查找最里面的请求并用新的转发请求替换它

因此外部包装器不会改变,例如,如果您要求它返回queryString,如果它有一个缓存的查询字符串,它将返回相同的字符串,而不是转发的字符串

我有一个问题,我正在努力解决。如果我成功了,我会再发一次

请看我刚刚发布的这个问题,以便更好地描述我的意思: