‭ᑋᵉᑊᑊᵒ ᵕ̈ 2025-09-02 09:10 采纳率: 60%
浏览 16
已结题

访问积木报表静态资源404

积木报表在本地环境运行正常,可以请求到静态资源。
但是部署到生产环境后,请求静态资源404,原因是缺少了url前缀:/api

200:/api/jmreport/desreport_/codemirror/addon/hint/sql-hint.js?v=1736231838.10
404:/jmreport/desreport_/codemirror/addon/hint/sql-hint.js?v=1736231838.10

img

应该怎么解决,如果我修改yml的context-path可能会影响其他的接口

  • 写回答

4条回答 默认 最新

  • 宝码香车 优质创作者: JavaScript技术领域 2025-09-02 10:46
    关注

    让【宝码香车】来帮您解答,本回答参考DeepSeek编写,并整理提供。

    如果答案让您满意,请采纳、点赞、关注,非常感谢!
    .
    每日一句正能量,让它带给您好心情:真正的强大,是能笑着面对曾经的狼狈。
    .

    积木报表静态资源404问题解决方案

    根据您描述的问题,积木报表在生产环境中静态资源请求404是因为缺少了URL前缀/api。以下是几种解决方案:

    方案一:配置Nginx反向代理(推荐)

    在Nginx配置中添加URL重写规则:

    location /jmreport/ {
        proxy_pass http://your-backend-service/api/jmreport/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
    

    或者使用rewrite规则:

    location /jmreport/ {
        rewrite ^/jmreport/(.*)$ /api/jmreport/$1 break;
        proxy_pass http://your-backend-service;
    }
    

    方案二:修改应用配置

    在应用的配置文件中添加静态资源路径前缀:

    # application.yml
    jmreport:
      resource:
        prefix: /api
    

    或者针对Spring Boot应用:

    @Configuration
    public class WebConfig implements WebMvcConfigurer {
        @Override
        public void addResourceHandlers(ResourceHandlerRegistry registry) {
            registry.addResourceHandler("/jmreport/**")
                    .addResourceLocations("classpath:/static/jmreport/")
                    .resourceChain(true);
        }
    }
    

    方案三:使用相对路径配置

    在积木报表的配置中修改资源路径:

    // 如果是前端配置问题
    window.JMREPORT_CONFIG = {
        baseURL: '/api/jmreport',
        resourcePrefix: '/api'
    };
    

    方案四:添加过滤器处理

    创建过滤器自动添加前缀:

    @Component
    public class JmReportFilter implements Filter {
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
                throws IOException, ServletException {
            HttpServletRequest req = (HttpServletRequest) request;
            HttpServletResponse res = (HttpServletResponse) response;
            
            String path = req.getRequestURI();
            if (path.startsWith("/jmreport/") && !path.startsWith("/api/jmreport/")) {
                String newPath = "/api" + path;
                request.getRequestDispatcher(newPath).forward(request, response);
                return;
            }
            chain.doFilter(request, response);
        }
    }
    

    方案五:修改积木报表源码

    如果使用的是开源版本,可以直接修改资源引用路径:

    // 查找所有资源引用位置,添加/api前缀
    const resources = document.querySelectorAll('script[src*="jmreport"], link[href*="jmreport"]');
    resources.forEach(resource => {
        if (resource.src) {
            resource.src = resource.src.replace('/jmreport/', '/api/jmreport/');
        }
        if (resource.href) {
            resource.href = resource.href.replace('/jmreport/', '/api/jmreport/');
        }
    });
    

    推荐使用方案一,通过Nginx配置来解决,这样既不会影响其他接口,也不需要修改应用代码,是最安全可靠的解决方案。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 9月10日
  • 已采纳回答 9月2日
  • 创建了问题 9月2日