如何在 spring boot 服务器中托管 angular 构建文件?
How to host angular build files in springboot server?
我有一个 spring 引导配置文件,类似于以下内容,
server:
port: 8002
servlet:
context-path: /api/
...
spring:
mvc:
static-path-pattern: "/resources/**"
...
我已将我的 angular 项目的构建文件复制粘贴到 resources/resources/static
。
不知道这是否相关。
这是我的 JwtFilter.java
,
@Component
public class JwtFilter extends OncePerRequestFilter {
final private JwtUtil jwtUtil;
@Autowired
JwtFilter(JwtUtil jwtUtil) {
this.jwtUtil = jwtUtil;
}
@Override
protected void doFilterInternal(
HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse,
FilterChain filterChain
) throws ServletException, IOException {
Cookie[] cookies = httpServletRequest.getCookies();
if(cookies == null) {
cookies = new Cookie[]{};
}
Cookie jwtCookie = Arrays.stream(cookies)
.filter(cookie -> cookie.getName().equals(StringConstants.JWT_AT_COOKIE_NAME))
.findFirst()
.orElse(null);
Cookie rtCookie = Arrays.stream(cookies)
.filter(cookie -> cookie.getName().equals(StringConstants.RT_COOKIE_NAME))
.findFirst()
.orElse(null);
if (rtCookie == null) {
httpServletResponse.sendError(401, "REFRESH_TOKEN_NOT_FOUND");
return;
}
String jwt = null;
String uid = null;
try {
if (jwtCookie != null) {
jwt = jwtCookie.getValue();
uid = jwtUtil.extractSubject(jwt);
} else {
httpServletResponse.sendError(401, "User not authenticated!");
}
if (uid != null) {
if (!jwtUtil.validateToken(jwt)) {
httpServletResponse.sendError(401, "EXPIRED_JWT_TOKEN_EXCEPTION");
return;
}
}
} catch (SignatureException exception) {
httpServletResponse.sendError(403, exception.getMessage());
return;
}
filterChain.doFilter(httpServletRequest, httpServletResponse);
}
@Override
protected boolean shouldNotFilter(HttpServletRequest request) {
String path = request.getRequestURI();
return path.equals("/api/auth") || path.equals("/api/auth/");
}
}
我尝试将这些 js 构建文件添加到 META-INF/resources、public 和资源中。
也不去。
目录结构为:
- java/
...
- 资源/
- 资源/
- 元信息/
- 资源/[包含angular构建文件]
- public/[包含 angular 个构建文件]
- 资源/[包含angular构建文件]
- 静态/[包含 angular 个构建文件]
现在如果我去 http://localhost:8002/
然后它只是说
HTTP Status 404 – Not Found
.
项目结构需要做更多的工作。
在此处查看问题。
删除这个。
spring:
mvc:
static-path-pattern: "/resources/**"
您想将 npm build
个工件放入 src/main/resources/static
。
首先,npm run build
你会在dist/
里面找到神器。
将 dist/
中的任何内容复制到 src/main/resources/static/
中。例如,dist/index.html
将被复制并粘贴到 src/main/resources/static/index.html
.
强制 Springboot 服务 index.html
但是,这里有一个问题。如果您确实介意 url 中的哈希片段 #/foo/bar
,您需要告诉 Springboot 在 404.
上提供 index.html
@SpringBootApplication
public class BlogApiApplication {
public static void main(String[] args) {
SpringApplication app = new SpringApplication(BlogApiApplication.class);
app.run(args);
}
@Bean
public EmbeddedServletContainerCustomizer containerCustomizer() {
return new EmbeddedServletContainerCustomizer() {
@Override
public void customize(ConfigurableEmbeddedServletContainer container) {
ErrorPage error404Page = new ErrorPage(HttpStatus.NOT_FOUND, "/index.html");
container.addErrorPages(error404Page);
}
};
}
}
这样就不需要哈希模式了。 React、Vue 也是如此。
我有一个 spring 引导配置文件,类似于以下内容,
server:
port: 8002
servlet:
context-path: /api/
...
spring:
mvc:
static-path-pattern: "/resources/**"
...
我已将我的 angular 项目的构建文件复制粘贴到 resources/resources/static
。
不知道这是否相关。
这是我的 JwtFilter.java
,
@Component
public class JwtFilter extends OncePerRequestFilter {
final private JwtUtil jwtUtil;
@Autowired
JwtFilter(JwtUtil jwtUtil) {
this.jwtUtil = jwtUtil;
}
@Override
protected void doFilterInternal(
HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse,
FilterChain filterChain
) throws ServletException, IOException {
Cookie[] cookies = httpServletRequest.getCookies();
if(cookies == null) {
cookies = new Cookie[]{};
}
Cookie jwtCookie = Arrays.stream(cookies)
.filter(cookie -> cookie.getName().equals(StringConstants.JWT_AT_COOKIE_NAME))
.findFirst()
.orElse(null);
Cookie rtCookie = Arrays.stream(cookies)
.filter(cookie -> cookie.getName().equals(StringConstants.RT_COOKIE_NAME))
.findFirst()
.orElse(null);
if (rtCookie == null) {
httpServletResponse.sendError(401, "REFRESH_TOKEN_NOT_FOUND");
return;
}
String jwt = null;
String uid = null;
try {
if (jwtCookie != null) {
jwt = jwtCookie.getValue();
uid = jwtUtil.extractSubject(jwt);
} else {
httpServletResponse.sendError(401, "User not authenticated!");
}
if (uid != null) {
if (!jwtUtil.validateToken(jwt)) {
httpServletResponse.sendError(401, "EXPIRED_JWT_TOKEN_EXCEPTION");
return;
}
}
} catch (SignatureException exception) {
httpServletResponse.sendError(403, exception.getMessage());
return;
}
filterChain.doFilter(httpServletRequest, httpServletResponse);
}
@Override
protected boolean shouldNotFilter(HttpServletRequest request) {
String path = request.getRequestURI();
return path.equals("/api/auth") || path.equals("/api/auth/");
}
}
我尝试将这些 js 构建文件添加到 META-INF/resources、public 和资源中。 也不去。
目录结构为:
- java/ ...
- 资源/
- 资源/
- 元信息/
- 资源/[包含angular构建文件]
- public/[包含 angular 个构建文件]
- 资源/[包含angular构建文件]
- 静态/[包含 angular 个构建文件]
- 元信息/
- 资源/
现在如果我去 http://localhost:8002/
然后它只是说
HTTP Status 404 – Not Found
.
项目结构需要做更多的工作。
在此处查看问题。
删除这个。
spring:
mvc:
static-path-pattern: "/resources/**"
您想将 npm build
个工件放入 src/main/resources/static
。
首先,npm run build
你会在dist/
里面找到神器。
将 dist/
中的任何内容复制到 src/main/resources/static/
中。例如,dist/index.html
将被复制并粘贴到 src/main/resources/static/index.html
.
强制 Springboot 服务 index.html
但是,这里有一个问题。如果您确实介意 url 中的哈希片段 #/foo/bar
,您需要告诉 Springboot 在 404.
index.html
@SpringBootApplication
public class BlogApiApplication {
public static void main(String[] args) {
SpringApplication app = new SpringApplication(BlogApiApplication.class);
app.run(args);
}
@Bean
public EmbeddedServletContainerCustomizer containerCustomizer() {
return new EmbeddedServletContainerCustomizer() {
@Override
public void customize(ConfigurableEmbeddedServletContainer container) {
ErrorPage error404Page = new ErrorPage(HttpStatus.NOT_FOUND, "/index.html");
container.addErrorPages(error404Page);
}
};
}
}
这样就不需要哈希模式了。 React、Vue 也是如此。