关于undertow.resourcePath的问题求助,官方文档反复读了几次了

在ide上的目录结构,还有resourcePath配置如下图所示:

image.png

package com.jimi.common.interceptor.global;

import com.jfinal.aop.Interceptor;
import com.jfinal.aop.Invocation;
import com.jfinal.core.Controller;
import com.jfinal.log.Log;
import com.jfinal.plugin.redis.Redis;
import com.jimi.utils.BaseUtil;
import com.jimi.utils.Result;

public class AuthInterceptor implements Interceptor {

	@Override
	public void intercept(Invocation inv) {
		
		try {
			Controller controller = inv.getController();
			BaseUtil.setRequest(controller.getRequest());
			String token = controller.getCookie("Admin-Token", "");
			if (!Redis.use().exists(token)) {
				controller.redirect(controller.getRequest().getContextPath()+"/static/dist/index.html#/user/login");
                return;
            }
			inv.invoke();
		} catch (Exception e) {
			inv.getController().renderJson(Result.error("服务器响应异常"));
            Log.getLog(inv.getController().getClass()).error("响应错误", e);
		} finally {
			BaseUtil.removeThreadLocal();
		}

	}

}

写了个全局拦截器。就是没登录的时候跳到登录页面。

问题来了。在本地环境上是可以跑通的。如下图:、

image.png

image.png

但是发到自己的服务器上就加载不到静态资源了。如下图:

image.png

image.png

我反复看了好几遍官方文档。仔细的读。但是不明白"classpath:static" 表示从 class path 以及 jar 包中的 static 路径下去加载 web 静态资源.这句话是什么意思。classpath是指那个目录?如下图。image.png

打包后目录结构是这样的。那么classpath是指哪里?我试过在undertow.resourcePath = classpath:webapp, classpath:webapp/static/dist, classpath:webapp/static/swagger这些我都试过配了。但是结果还是取不到静态资源。我都快要看晕了。

求支援一波~

评论区

cxfff

2019-07-13 10:59

我是jfinal初学者。我想用jfinal和比较流行的antd写个demo来学习一下。觉得jfinal这个框架很不错。但是遇到很多问题。求波总指导一下。

JFinal

2019-07-13 11:49

先解决两个明显的错误,然后再继续推进:
1: 第一个错误,拦截器中的 controller.redirect(url) 中的 url 参数必须指向一个 action, 不能指向一个 .html 页面

2:基于你的项目结构,undertow.resourcePath 配置成 src/main/webapp 即可。 然后项目中 html 页面对于 static 目录下面的资源引用路径要对,例如对于 swagger-ui.css 的引用的值应该是这样的:
/static/swagger/swagger-ui.css

此外, class path 在开发时是指你的 target/classes 目录, 在部署时是指你的 config 目录,当然这里只提到了目录,class path 还包括你项目引入的所有 .jar 包资源。 这个是 Java 基础,与 jfinal 是无关的

cxfff

2019-07-13 14:13

@JFinal 波总,是这样的。前端是用的React写的。React用webpack打包后就是上述的目录结构。java后台全部都是Restcontroller。统一先访问页面。页面用axios请求后台接口得到数据再渲染。所以整个项目所有action都是renderJson返回了。

cxfff

2019-07-13 14:17

@JFinal 感谢波总指导。原来classpath在服务器指的是config目录啊。那我明白了。怪不得我怎么配都错。我的这种项目结构。其中一个js1点多兆,配好classpath后。可以拿到静态资源了。但是第一次访问要20秒。我的个乖乖。有没有啥方法。让下载静态资源快点呢?我现在是越来越喜欢jfinal框架了。轻巧方便。

JFinal

2019-07-13 14:21

@cxfff class path 在服务器上是 config 目录,这个是打包插件自动处理的,并不需要你手动配置

JFinal

2019-07-13 14:22

@cxfff 第一次访问要 20 秒,后面访问快,这肯定是图片等资源太大,第一次访问后会在你浏览器中本地缓存,所以第二次访问快,这个肯定是 jfinal 无法干涉的, 纯粹带宽与网速度问题

cxfff

2019-07-13 15:05

@JFinal 明白了。感谢波总。

sunfog

2020-03-12 23:49

@JFinal 您好 undertow.resourcePath 在服务器上应该配置成什么目录?

JFinal

2020-03-13 00:14

@sunfog 一般情况下开发时候配置好的可以直接用于服务器

如果你希望部署的时候可以指向项目下 webapp 子目录以外的地方,那么才需要为 undertow.resourcePath 添加额外的配置

jfinal undertow 中, undertow.resourcePath 的默认配置为:src/main/webapp, WebRoot, WebContent, webapp

项目中启动的时候会依次检测上述目录是否存在,存在则真正让其有效,否则跳过

注意,上述配置都是从项目根目录下面去搜寻的,如果你要配置绝对路径,需要以 "/" 打头,例如:
/var/img

sunfog

2020-03-13 10:53

@JFinal 谢谢 将addSharedFunction的全路径配置里好用了

JFinal

2020-03-13 11:43

@sunfog addShardedFunction(...) 超级方便

jinp

2020-04-09 17:55

@JFinal @sunfog 对于部署时classpath指向config目录的问题,使用undertow.resourcePath配置绝对目录,相对目录,addShardedFunction中配置全路径,都未生效,最后页面渲染还是出现文件找不到的错误,是为什么?

热门反馈

扫码入社