gpt4 book ai didi

java - 如何从 war 中服务 Angular 应用程序

转载 作者:行者123 更新时间:2023-11-30 08:37:40 25 4
gpt4 key购买 nike

我有一个 Web 应用程序,它是使用 Maven 构建的。此 Web 应用程序包含我的后端作为休息服务。

我还有一个 Angular 应用程序,我想使用它来使用所述 Web 应用程序(它使用 npm 和 webpack 进行捆绑)。

如何从包含我的后端的同一个 war 中为我的 Angular 应用程序提供服务?比如说,在路径 .../index.html 中?

最佳答案

为了让我的 Angular 项目在 WAR 中工作,我创建了一个 Maven 项目,其中只有 2 个文件(在 Angular 文件旁边):

  • pom.xml
  • src/main/java/com/stackoverflow/AngularFilter.java

pom.xml的内容:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.stackoverflow.example</groupId>
<artifactId>angular-example</artifactId>
<version>1.0.0</version>
<packaging>war</packaging>

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<warSourceDirectory>${basedir}/src/angular/dist/angular</warSourceDirectory>
</configuration>
</plugin>
</plugins>
</build>

<dependencies>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-web-api</artifactId>
<version>7.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>

warSourceDirectory 元素中,我引用了 Angular 构建输出。 (必须使用正确的 --base-href 值构建 Angular 文件。)

单独的 pom.xml 文件就足以让 Angular 应用程序正常工作。 但是,如果没有 AngularFilter.java 文件,刷新 Angular 路由将不起作用。使用以下过滤器类,也可以刷新 Angular 路由:

package com.stackoverflow;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;

@WebFilter("/*")
public class AngularFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {}

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpRequest = ((HttpServletRequest) request);
String contextPath = httpRequest.getContextPath();
String requestURI = httpRequest.getRequestURI();
String angularPath = requestURI.substring(contextPath.length());
if (isAngularRoute(angularPath)) {
request.getRequestDispatcher("/index.html").forward(request, response);
} else {
chain.doFilter(request, response);
}
}

private boolean isAngularRoute(String angularPath) {
return
/* Do not reroute files in the Angular root, such as index.html,
main.js, polyfills.js, runtime.js, styles.css and favicon.ico */
((angularPath.indexOf('/', 1) != -1) || (angularPath.indexOf('.') == -1))
/* Do not reroute static files */
&& !angularPath.startsWith("/assets/");
}

@Override
public void destroy() {}
}

还有其他使用 Spring MVC 来启用刷新 Angular 路由的解决方案,如下所述:Springboot/Angular2 - How to handle HTML5 urls?

但是,我认为如果单个 Filter 类就可以完成这项工作,那么使用 Spring 就有点矫枉过正了。

关于java - 如何从 war 中服务 Angular 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37065558/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com