TomEE / Angular - 如何将未知路径从 TomEE 重定向到 Angular 前端?

TomEE / Angular - How to redirect unknown paths from TomEE to Angular Frontend?

我在网上搜索了好几天,但无法解决我的问题。希望大家帮我开开眼=)

我的情况:

我正在开发一个独立的服务,后面有 TomEE 和 Angular 前端。两个部分通过 REST 调用进行通信。我在服务器端的 Java-Code 中使用 JAX-RS 定义了它们。 Angular 调用它们让服务器 运行 运行。

我的问题:

如果我进入我的网页的根目录,Angular-页面被加载并且使用我的angular-应用程序导航到子页面工作正常。 但是,当我在调用根路径之前直接使用 /pages/in/my/angular/app 之类的子路径时,我的 TomEE 收到 404 错误。

我的问题:

我如何配置 TomEE / Angular 以便 TomEE 不知道的所有路径都将被重定向到 Angular 应用程序并告诉 angular-router 去那里?

如果需要任何代码,请说明。 感谢您的帮助。

您有多种选择,最知名的是:

  1. 自定义过滤器

        @Override // create a list of angular prefixes stored in frontendResources
        public void doFilter(final ServletRequest servletRequest, final ServletResponse servletResponse,
                             final FilterChain filterChain) throws IOException, ServletException {
            if (HttpServletRequest.class.isInstance(servletRequest)) {
                final HttpServletRequest req = HttpServletRequest.class.cast(servletRequest);
                final String path = req.getRequestURI().substring(req.getContextPath().length());
                for (String resource : frontendResources) {
                    if (path.startsWith(resource)) { // angular routes
                        filterChain.doFilter(new HttpServletRequestWrapper(req) {
                            @Override
                            public String getPathInfo() {
                                return "";
                            }
    
                            @Override
                            public String getServletPath() {
                                return "/index.html";
                            }
                        }, servletResponse);
                        return;
                    }
                }
            }
            filterChain.doFilter(servletRequest, servletResponse);
        }
    
  2. tomcat 重写阀 https://tomcat.apache.org/tomcat-8.5-doc/rewrite.html

  3. 使用 web.xml 并将前面的 url-模式映射到 index.html(jsp-文件适用于实例或仅默认 servlet)

因为我已经使用了 javax.servlet.annotation.WebFilter 和一个没有 web.xml 等的嵌入式 TomEE(我使用我公司的模板来提供独立服务),所以我终于成功了。所以这就是我所做的:

首先,我设法在我的应用程序过滤器中添加了对所有 uris 的正则表达式检查。当正则表达式匹配时,调用将被重定向到我的应用程序的根路径。 我的 angular-前端必须从头开始,用例定义它。

这是我的 class 实现过滤器的重定向代码。代码与 doFilter-Method:

@Override    
public void doFilter(final ServletRequest request, final ServletResponse 
response, final FilterChain chain) throws IOException, ServletException 
{
final HttpServletRequest httpRequest = (HttpServletRequest) request;
final String pattern = "(^\/pathToMyApp\/$)|(^\/pathToMyApp\/rest\/.*)|(^\/pathToMyApp\/.*\..*)";
final String baseUri = "/pathToMyApp/";    
if (!httpRequest.getRequestURI().matches(pattern)) {
        logger.warning("--------------------------------------------------------------");
        logger.warning("requestUri: " + httpRequest.getRequestURI());
        logger.warning("uri doesn't match regex, redirecting to root");
        HttpServletResponse resp = (HttpServletResponse) response;
        resp.sendRedirect(baseUri);
        logger.warning("--------------------------------------------------------------");
        return;
    }
}

Regex 模式将允许 运行 对 /pathToMyApp//pathToMyApp/rest/* 或文件的所有调用:/pathToMyApp/*.*.