我在tomcat服务器上有一些关于路径和网址的谜题,让我解释一下:
我的tomcat webapp目录是:/ server
我在目录/ server / myapp / subfolder
中部署了一个spring应用程序这意味着我的上下文路径/ server / myapp
我的servlet有一个/ subfolder / *
的url模式我的servlet可以通过网址http://server.com/myapp/subfolder/
联系到在我的许多弹簧控制器中,我返回一个重定向:
return "redirect:/item/list";
这会将访问者重定向到http://server.com/myapp/item/list
这当然导致404导致正确的网址为:http://server.com/myapp/subfolder/item/list
只需将所有内容都设置为单独的webapp或简单地删除url-pattern即可轻松解决此问题。但两者都不可能,因为单独的webapp意味着不同的类加载器(导致其他系统出现问题)和url-pattern like /将与服务器上运行的其他应用程序冲突。
我可以将我的重定向更改为" redirect:/ subfolder / item / list",这将修复重定向。
是否有更好的解决方案,以便我不必手动添加"子文件夹/"在哪里使用contextpath?
答案 0 :(得分:3)
您可以从HttpServletRequest.getContextPath()获取应用程序上下文路径,而不是硬连接应用程序上下文路径。
答案 1 :(得分:2)
Spring有ServletUriComponentsBuilder
你可以利用它。您可以将当前请求传递给它,并将其附加到您想要转到的位置。为您节省/subfolder
或其他任何操作的硬编码。
UriComponents uri = ServletUriComponentsBuilder
.fromServletMapping(request)
.fromPath("/item/list")
.build();
return "redirect:" + uri.toUriString();
当然,您可以将其置于实用方法中。这仅适用于重定向到同一DispatcherServlet
内的网址的情况。
答案 2 :(得分:1)
最后我简单地创建了一个util函数:
public String redirect(String path){
return "redirect:/subfolder"+path;
}
有点hacky,但它允许我快速更改"子文件夹"如果url-pattern改变了。
视图中的@url标签也使用了contextpath,所以我创建了自己的@url标签,它添加了"子文件夹"到contextpath。
现在春天似乎很开心,我再也找不到404了。答案 3 :(得分:1)
我知道这是一个老问题,但是如果有人在寻找当前答案,则RedirectView(至少在最新的5.0.9版本中)具有一个contextRelative布尔参数,默认情况下为false。将其设置为true可使重定向上下文成为相对的。例如:
SELECT ROUTBOM.*,;
MAT.Name AS Mat_Name,;
HARD.Name AS Hard_Name,;
ROUT.Name AS Rout_Name;
FROM ROUTBOM;
LEFT JOIN Mat ON ROUTBOM.ID = MAT.ID;
LEFT JOIN Hard ON ROUTBOM.ID = HARD.ID;
LEFT JOIN Rout ON ROUTBOM.ID = Rout.ID;
WHERE < all whatever conditions >;
INTO CURSOR Results READWRITE
SELECT Results
BROWSE
参考:docs