gpt4 book ai didi

Spring Boot/Angular 2 - 如何处理 HTML5 url?

转载 作者:IT老高 更新时间:2023-10-28 13:04:52 25 4
gpt4 key购买 nike

我相信这是一个简单的问题,但我找不到答案,或者至少在搜索中使用了正确的术语。

我正在一起设置 Angular2Springboot。默认情况下,Angular 将使用 localhost:8080\dashboardlocalhost:8080\dashboard\detail 等路径。

如果可能的话,我想避免使用路径作为哈希值。作为 Angular documentation状态:

The router's provideRouter function sets the LocationStrategy to the PathLocationStrategy, making it the default strategy. We can switch to the HashLocationStrategy with an override during the bootstrapping process if we prefer it.

然后……

Almost all Angular 2 projects should use the default HTML 5 style. It produces URLs that are easier for users to understand. And it preserves the option to do server-side rendering later.

问题是,当我尝试访问 localhost:8080\dashboard 时,Spring 会寻找一些映射到该路径的 Controller ,而它不会。

Whitelabel Error Page
There was an unexpected error (type=Not Found, status=404).
No message available

我最初想将我的所有服务都放在 localhost:8080\api 下,并将所有静态服务放在 localhost:8080\app 下。但是我如何告诉 Spring 忽略对这个 app 路径的请求呢?

Angular2 或 Boot 是否有更好的解决方案?

最佳答案

在我的 Spring Boot 应用程序(版本 1 和 2)中,我的静态资源位于一个位置:

src/main/resources/static

static为Spring Boot识别加载静态资源的文件夹。

那么思路就是自定义Spring MVC配置。
更简单的方法是使用 Spring Java 配置。

我实现了 WebMvcConfigurer 来覆盖 addResourceHandlers()。我将 single ResourceHandler 添加到当前的 ResourceHandlerRegistry
处理程序映射到每个请求,我将 classpath:/static/ 指定为资源位置值(如果需要,您当然可以添加其他值)。
我添加了一个自定义 PathResourceResolver 匿名类来覆盖 getResource(String resourcePath, Resource location)
返回资源的规则如下:如果资源存在并且可读(所以它是一个文件),我返回它。否则,默认情况下我会返回 index.html 页面。这是处理 HTML 5 url 的预期行为。

Spring Boot 1.X 应用程序:

扩展org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter是办法。
类是WebMvcConfigurer接口(interface)的适配器使用空方法允许子类仅覆盖他们感兴趣的方法。

这是完整的代码:

import java.io.IOException;

import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.resource.PathResourceResolver;

@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {


@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {

registry.addResourceHandler("/**/*")
.addResourceLocations("classpath:/static/")
.resourceChain(true)
.addResolver(new PathResourceResolver() {
@Override
protected Resource getResource(String resourcePath,
Resource location) throws IOException {
Resource requestedResource = location.createRelative(resourcePath);
return requestedResource.exists() && requestedResource.isReadable() ? requestedResource
: new ClassPathResource("/static/index.html");
}
});
}
}

Spring Boot 2.X 应用程序:

org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter 已弃用。
直接实现 WebMvcConfigurer 是现在的方式,因为它仍然是一个接口(interface),但它现在具有默认方法(通过 Java 8 基线实现)并且可以直接实现而无需适配器。

这是完整的代码:

import java.io.IOException;

import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.resource.PathResourceResolver;

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {

registry.addResourceHandler("/**/*")
.addResourceLocations("classpath:/static/")
.resourceChain(true)
.addResolver(new PathResourceResolver() {
@Override
protected Resource getResource(String resourcePath,
Resource location) throws IOException {
Resource requestedResource = location.createRelative(resourcePath);
return requestedResource.exists() && requestedResource.isReadable() ? requestedResource
: new ClassPathResource("/static/index.html");
}
});
}
}

编辑以解决一些评论:

对于那些将其静态资源存储在另一个位置作为 src/main/resources/static 的人,因此更改 addResourcesLocations() 的 var args 参数的值。
例如,如果您在 staticpublic 文件夹中都有静态资源(未尝试):

  registry.addResourceHandler("/**/*")
.addResourceLocations("classpath:/static/", "/public")

关于Spring Boot/Angular 2 - 如何处理 HTML5 url?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38516667/

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