有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

单页应用程序的JavaSpring引导资源处理程序模式

我的Spring Boot配置中有以下内容:

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.setOrder(Ordered.HIGHEST_PRECEDENCE)
            .addResourceHandler("**/*.*")
            .addResourceLocations("file:static/");
}

由于我正在创建一个单页应用程序,如果以下情况属实,我希望此资源处理程序能够交付静态文件:

  • URL不以/api开头
  • 此资源处理程序包含一个与URL路径匹配的文件

如果没有匹配的文件,资源处理程序不应该用404响应,而是让调用通过项目的控制器

在其中一个例子中,我将我的后备策略放在索引中。html注释(同样,除非URL以/api开头):

@GetMapping({"/**", "/"})

最后一部分工作正常,但问题是,如果没有匹配的文件,资源处理程序将返回404,而不是让调用(我习惯了Node.js和Go的中间件模式)通过控制器。我怎样才能做到这一点?我可以创建自己的资源处理程序,使其更像中间件吗

例如,在Go with Echo中,您只需要启用HTML5,并为/api提供一个skipper函数:

func main() {
    server := echo.New()

    server.Use(middleware.Static("static"))
    server.Use(middleware.StaticWithConfig(middleware.StaticConfig{
        Root:    "static",
        HTML5:   true,
        Skipper: noHTML5IfAPICallSkipper,
    }))

    server.Logger.Fatal(server.Start(":1323"))
}

func noHTML5IfAPICallSkipper(context echo.Context) bool {
    if strings.HasPrefix(context.Path(), "/api/") {
        return true
    }

    return false
}

如何在Spring Boot中启用此单页应用程序路由模式

哦,顺便说一句,静态文件是从磁盘提供的,而不是从类路径或打包在jar中的任何东西提供的,这一点很重要。该服务将与Docker一起运行,并且必须能够从容器外部装载文件


共 (1) 个答案

  1. # 1 楼答案

    试试这个:

    public class Application  extends WebMvcConfigurerAdapter { // or implements WebMvcConfigurer (Spring Boot 2)
    
        @Value("${static.path}")
        private String staticPath;
    
        @Override
        public void addResourceHandlers(ResourceHandlerRegistry registry) {
             registry.addResourceHandler("/**/*.*").addResourceLocations("file:"+staticPath);
        }
    
        @Override
        public void addViewControllers(ViewControllerRegistry registry) {
            registry.addViewController("/").setViewName("/index.html");
        }
    
        ...
    }
    

    您必须添加到应用程序中。属性文件行:

    `static.path=path/to/static/content`
    

    如果要使用Docker,此路径需要引用内部Docker容器目录,例如:/opt/app/statics,然后将外部路径映射到:

    您必须添加到应用程序中。属性文件行:static.path=/opt/app/statics

    然后像这样执行docker:

    docker run ... -v /absolute/static/path/at/host:/opt/app/statics image:version