リクエストが HttpServletRequestWrapper によってラップされている場合、サーブレット転送を機能させるのに問題があります。
これはサーバー側の Equinox アプリケーションであり、Eclipse 内から実行され、組み込みの Jetty Web サーバーを使用して HttpService 実装を提供します。
問題を切り分けるために、私のフィールドで行う唯一のことは、リクエストをラップして転送することです。
public class TestFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
chain.doFilter(new HttpServletRequestWrapper((HttpServletRequest)request), response);
}
...
}
...そして、私のサーブレットは 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();
}
}
サーブレット 2.3 仕様によると、転送メソッドに渡される要求オブジェクトと応答オブジェクトは、元のものか、提供されたラッパーのインスタンスのいずれかです。カスタム ラッパーを渡す必要がありますが、それを行うと、転送は次の例外で失敗します。
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)
...
ラッパーを取り除き、元のリクエストを転送すると、サーブレットの転送は成功します。
これは org.eclipse.equinox.http.servlet 実装のバグのように見えますが、何かが欠けている可能性があります。
私は何か間違ったことをしていますか?
ありがとうございました!!
エドゥアルド・ボーン