0

私は、関連付けられた REST API を使用して単一ページの Web アプリケーションを開発しているチームに所属しています。

誰かが私を助けることができるのだろうか?特定の URL にアクセスした場合に、アプリケーションが index.html の内容を 200 応答で返す方法を見つけようとしています。たとえば、クライアントは URL に情報を埋め込みたいが、index.html のコンテンツが返されることを期待しています。

たとえば、単一ページの Web アプリケーションは、単一のコンテキスト ルート (例: http://host:9082/webapp ) で利用できます。

http://host:9082/webapp/api/で使用できるRESTエンドポイントがあります。これらのエンドポイントは、インデックス html を返してはならず、適切なステータス コード (400、404、200、201 など) を含む有効な REST 応答のみを返す必要があります。 )

Java スクリプトは http://host:9082/webapp/js/から提供されます。また、index.html にフォールバックしたくない場所が他にもあります。

ただし、クライアントがhttp://host:9082/webapp/resource/7/showを要求した場合、index.html がステータス コード 200 で返されるようにします。その後、クライアントは URL から意味を抽出して、他の REST 要求を実行します。

そこで、次のようなフィルターを作成しようとしました。

@Override
public void doFilter(ServletRequest servletRequest,ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException
{
    final HttpServletRequest request = (HttpServletRequest)servletRequest;
    final HttpServletResponse response = (HttpServletResponse)servletResponse;
    final String requestUri = request.getRequestURI();
    if (!excluded(requestUri))
    {
        request.getRequestDispatcher(INDEX_HTML).forward(request, response);
    }
    else
    {
        filterChain.doFilter(servletRequest, servletResponse);
    }
}

private boolean excluded(String requestUri)
{
    for (String part : mExcludedUriParts)
    {
        if (requestUri.contains(part))
        {
            return true;
        }
    }
    return false;
}

次のように web.xml でフィルターを有効にします。

<filter>
    <filter-name>FallbackFilter</filter-name>
    <filter-class>com....http.filter.internal.FallbackFilter</filter-class>
    <init-param>
        <param-name>excludedUriParts</param-name>
        <param-value>/api/,.js/,.png,.html,/apidocs/,/users/imgs/</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>FallbackFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

ただし、このアプローチは非常に脆弱です。展開されたサーバーで利用可能なリソースに一致するように web.xml を変更する必要があるためです。これはもちろん変更される可能性があります。

また、filterChain で 404 を検出して応答を変更することも検討しましたが、Liberty は応答が既にコミットされているため、これを許可しませんでした。また、インデックス html を返すかどうかの基準としてリクエストの受け入れヘッダー (つまり、text/html) を使用することも検討しましたが、他の html ファイルがあるため、このアプローチも機能しませんでした。

基本的に、サーバー上に存在しない場所が 200 ステータス コードで index.html を返すことを許可する方法が必要です。理想的には、404 の通知を受けて、応答を制御したいと考えています。

Liberty のフィルターまたはその他のメカニズムを使用してこれを達成する方法はありますか?

どうもありがとう

4

1 に答える 1

0

これについては確信が持てませんが、応答を ServletResponseWrapper でラップすると、 PrintWriter.flush() をインターセプトできる可能性があるため、404 を設定しても応答がコミットされず、フィルターが機能します。これを別の用途に使用した例を次に示します。

https://www.ibm.com/support/knowledgecenter/SSAW57_8.5.5/com.ibm.websphere.nd.iseries.doc/ae/twbs_jaxrs_handlers_servlet_filters.html

于 2018-02-19T16:38:34.353 に答える