0

我在一个开发带有关联 REST API 的单页 Web 应用程序的团队中。

我想知道是否有人可以帮助我?如果访问某些 URL,我正在尝试为我们的应用程序找到一种方法来返回 index.html 的内容并返回 200 响应。例如,客户端希望在 URL 中嵌入信息,但希望返回 index.html 上的内容。

例如,我们的单页 Web 应用程序可在单个上下文根中使用,例如:http://host:9082/webapp

我们在http://host:9082/webapp/api/上有可用的 rest 端点...这些端点不得返回 index 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 不允许这样做,因为响应已经提交。我们也考虑过使用请求接受标头(即 text/html)作为是否返回 index 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 回答