在spring中使用url-pattern重定向的上下文路径

时间:2015-01-08 15:22:52

标签: java spring tomcat

我在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?

4 个答案:

答案 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