0

リクエストが 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 実装のバグのように見えますが、何かが欠けている可能性があります。

私は何か間違ったことをしていますか?

ありがとうございました!!

エドゥアルド・ボーン

4

2 に答える 2

0

これは、ProxyServlet.serviceメソッドのコードが原因で、サブストリングに-1を渡す必要があります。ただし、「forward」がコードを壊している理由は、「forward」がまったく新しいラッパー階層を作成しないためです。代わりに、最も内側のリクエストを見つけて、新しく転送されたリクエストに置き換えます。

したがって、外部ラッパーは変更されません。たとえば、queryStringを返すように要求した場合、キャッシュされたクエリ文字列がある場合は、転送されたものではなく、同じものが返されます。

これに問題があり、解決しようとしています。私が成功した場合は、ここに再度投稿します。

私が意味することのより良い説明については、私が投稿したばかりのこの質問を参照してください: リクエストがRequestWrapperオブジェクトで転送されるタイミングを知る方法

于 2011-04-11T13:52:07.887 に答える
0

リクエストの情報を解析するときに、ProxyServlet で問題が発生しているようです。

ProxyServlet のソースが見つかりました:

http://kickjava.com/src/org/eclipse/equinox/http/servlet/internal/ProxyServlet.java.htm

正確には一致しませんが、リクエストからパス情報を抽出しようとしていることがコードからわかります。予期していた「/」が見つかりませんでした。テストするためだけに、サーブレットのパスを微調整してみてはいかがでしょうか。

于 2011-02-23T05:34:55.190 に答える