作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 Web 应用程序,它是使用 Maven 构建的。此 Web 应用程序包含我的后端作为休息服务。
我还有一个 Angular 应用程序,我想使用它来使用所述 Web 应用程序(它使用 npm 和 webpack 进行捆绑)。
如何从包含我的后端的同一个 war 中为我的 Angular 应用程序提供服务?比如说,在路径 .../index.html 中?
最佳答案
为了让我的 Angular 项目在 WAR 中工作,我创建了一个 Maven 项目,其中只有 2 个文件(在 Angular 文件旁边):
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/
我是一名优秀的程序员,十分优秀!