当前位置: 首页 > 知识库问答 >
问题:

每个url路由和子例程的Spring单页“/a/**=>/a/index.html,除了/a/static/**”

曹季同
2023-03-14

我正在建立一个spring网站,在SubCure下有一个react单页应用程序,我当前的url结构应该是这样的

localhost/admin/** => react app
localhost/**       => spring thymeleaf/rest/websocket app for everything else

react app mapping:
localhost/admin/static/**  => static react files
localhost/admin/**         => react index.html for everything else

Example of project resources structure:  
resources/
    admin/         <= my admin react files is here
        index.html
        static/    <= react css, js,  statics
    templates/     <= thymeleaf templates
    static/        <= theamleaf static
    ...

所以我需要转发反应index.html文件为每个url路由和子路由基本上单页应用程序的一切,除了静态文件

看起来像一个常见的任务,这里有一些我已经尝试过的东西:

无法使用转发:/admin/index。html用于/admin/**,因为这将创建递归,因为管理/索引。html也在admin/**下,必须以某种方式拦截admin/static/**

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/admin/**")
            .addResourceLocations("classpath:/admin/");
}

index.html仅映射到/admin/index.htmlurl,并且此选项几乎有效,但仅当您从访问反应应用程序localhost/admin/index.html

共有1个答案

邓卓
2023-03-14

现在我正在使用customResourceResolver来解决这个问题

演示:https://github.com/varren/spring-react-example

@Configuration
public class BaseWebMvcConfigurerAdapter extends WebMvcConfigurerAdapter {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {

        ResourceResolver resolver = new AdminResourceResolver();
        registry.addResourceHandler("/admin/**")
                .resourceChain(false)
                .addResolver(resolver);


        registry.addResourceHandler("/admin/")
                .resourceChain(false)
                .addResolver(resolver);
    }


    private class AdminResourceResolver implements ResourceResolver {
        private Resource index = new ClassPathResource("/admin/index.html");

        @Override
        public Resource resolveResource(HttpServletRequest request, String requestPath, List<? extends Resource> locations, ResourceResolverChain chain) {
            return resolve(requestPath, locations);
        }

        @Override
        public String resolveUrlPath(String resourcePath, List<? extends Resource> locations, ResourceResolverChain chain) {
            Resource resolvedResource = resolve(resourcePath, locations);
            if (resolvedResource == null) {
                return null;
            }
            try {
                return resolvedResource.getURL().toString();
            } catch (IOException e) {
                return resolvedResource.getFilename();
            }
        }

        private Resource resolve(String requestPath, List<? extends Resource> locations) {

            if(requestPath == null) return null;

            if (!requestPath.startsWith("static")) {
                return index;
            }else{
                return new ClassPathResource("/admin/" + requestPath);
            }
        }
    }
}
 类似资料:
  • 问题内容: public void push(E element) { if (size == elements.length) { resize(); // doubel of size } elements[size++] = element; } Java中的a 和 a或a–和–a有什么区别 谢谢 问题答案: 或是后缀运算符,表示a的值将在对表达式求值后更改。 或是前缀运算,表示a的值将在对

  • 在BeX5中,功能树上会出现类似$UI/…/…/xx.a的url, 其中“.a”是一种特殊的url,“.a”通过以下规则,最终定位到具体的.w文件: 1. 如果登录的门户是5.3之前的门户 如果客户端是手机: 查找.w文件的顺序是 第一步:查找/mobileUI下相应的.w文件; 第二步:查找/UI2下相应的.m.w文件; 第三步:查找/UI2下相应的.w文件; 如果客户端是PC: 查找.w文件的

  • 问题内容: 正如我在标题中提到的 a + = b和a = + b以及a 和 a有什么区别?我有点困惑 问题答案: 相当于 相当于 且两者都增加1。不同之处在于,返回的是增量之前的值,而返回的是增量之后的值。 那是:

  • 实现的简单A*算法寻路Demo。A*寻路一般可用于游戏当中计算人物走动的线路。Demo测试方法是,迷宫中黑点是障碍物,绿点是可以走过的点,红点是起始点,然后点击任意绿点会生成一个灰色点,设置为终点。点击屏幕右上角的“移动按钮”,红点便开始了它的A*寻路之旅。 [Code4App.com]

  • 本文向大家介绍if(a-b <0)和if(a 相关面试题,主要包含被问及if(a-b <0)和if(a 时的应答技巧和注意事项,需要的朋友参考一下 并且可能意味着两个不同的东西。考虑以下代码: 运行时,将仅打印。发生的事情显然是错误的,但是溢出并变为,这是负面的。 话虽如此,请考虑一下数组的长度确实接近。中的代码如下所示: 确实接近,所以(是)可能溢出并变成(即负数)。然后,将 下溢 相减回正数。

  • 我们祝愿您的 Debian 安装顺利愉快,并希望您能发现 Debian 在您这里的用武之地。 还有您也许可以读一下 第 8 章 下一步该干什么。