spring 中带有 url-pattern 重定向的上下文路径

Tin*_*Sky 4 java spring tomcat

我对 tomcat 服务器上的路径和 url 有点困惑,让我解释一下:

我的tomcat webapp目录是:/server

我已经在目录 /server/myapp/subfolder 中部署了一个 spring 应用程序

这意味着我的上下文路径 /server/myapp

我的 servlet 的 url-pattern 为 /subfolder/*

我的 servlet 可以通过 url http://server.com/myapp/subfolder/ 访问

在我的许多弹簧控制器中,我返回一个重定向:

return "redirect:/item/list";
Run Code Online (Sandbox Code Playgroud)

这会将访问者重定向到http://server.com/myapp/item/list

这当然会导致 404,因为正确的 url 是:http : //server.com/myapp/subfolder/item/list

这可以通过将所有内容都放在一个单独的 web 应用程序中或简单地删除 url-pattern 来轻松解决。但两者都不可能,因为单独的 webapp 意味着不同的类加载器(导致其他系统出现问题),并且像 / 这样的 url-pattern 将与服务器上运行的其他应用程序冲突。

我可以将重定向更改为“重定向:/子文件夹/项目/列表”,这将修复重定向。

是否有更好的解决方案,以便我不必在使用上下文路径的任何地方手动添加“子文件夹/”?

小智 8

我知道这是一个老问题,但如果有人正在寻找当前的答案,RedirectView(至少在最新的 5.0.9 版本中)有一个 contextRelative 布尔参数,默认情况下为 false。将其设置为 true 会使重定向上下文相对。例如:

return new RedirectView("/account", true);
Run Code Online (Sandbox Code Playgroud)

参考:文档


Tin*_*Sky 2

最后我简单地做了一个util函数:

public String redirect(String path){
    return "redirect:/subfolder"+path;
}
Run Code Online (Sandbox Code Playgroud)

有点 hacky,但它允许我快速更改“子文件夹”,以防 url 模式发生变化。

视图中的 @url 标记也使用上下文路径,因此我创建了自己的 @url 标记,它将“子文件夹”添加到上下文路径。

现在春天看起来很开心,我不再收到任何 404 错误了。