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 去那里?
如果需要任何代码,请说明。
感谢您的帮助。
您有多种选择,最知名的是:
自定义过滤器
@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);
}
tomcat 重写阀 https://tomcat.apache.org/tomcat-8.5-doc/rewrite.html
- 使用 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/*.*
.
我在网上搜索了好几天,但无法解决我的问题。希望大家帮我开开眼=)
我的情况:
我正在开发一个独立的服务,后面有 TomEE 和 Angular 前端。两个部分通过 REST 调用进行通信。我在服务器端的 Java-Code 中使用 JAX-RS 定义了它们。 Angular 调用它们让服务器 运行 运行。
我的问题:
如果我进入我的网页的根目录,Angular-页面被加载并且使用我的angular-应用程序导航到子页面工作正常。
但是,当我在调用根路径之前直接使用 /pages/in/my/angular/app
之类的子路径时,我的 TomEE 收到 404 错误。
我的问题:
我如何配置 TomEE / Angular 以便 TomEE 不知道的所有路径都将被重定向到 Angular 应用程序并告诉 angular-router 去那里?
如果需要任何代码,请说明。 感谢您的帮助。
您有多种选择,最知名的是:
自定义过滤器
@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); }
tomcat 重写阀 https://tomcat.apache.org/tomcat-8.5-doc/rewrite.html
- 使用 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/*.*
.