Websphere Liberty Profile中的后备URL

时间:2018-02-19 12:52:14

标签: websphere-liberty open-liberty

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

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

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

我们在http://host:9082/webapp/api/上有可用的休息端点...这些端点不能返回索引html,它们只能返回带有相应状态代码(400,404,200,201等)的有效休息响应

Java脚本由http://host:9082/webapp/js/提供......还有其他一些我们不希望回退到index.html的位置

但是,如果客户端请求http://host:9082/webapp/resource/7/show,我们希望返回状态代码为200的index.html。客户端将从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)作为是否返回索引html的基础,但我们还有其他html文件,因此这种方法也不起作用。

我们基本上想要一种方法来允许服务器上的一些不存在的位置返回带有200状态代码的index.html。理想情况下,我们希望被告知404并控制响应。

有没有办法使用过滤器或Liberty中的任何其他机制来实现这一点?

非常感谢

1 个答案:

答案 0 :(得分: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