我是JSP和Java EE的新手。所以也许有一些非常明显的我错过了。
我有一个Web过滤器类,需要将Web请求重定向回当前Web应用程序的根目录。但由于我们的应用程序未部署在根目录中,因此我需要了解当前Web应用程序的路径。
e.g。 http://www.mydomain.com/myapplication/index.htm
我需要获得“myapplicaiton”部分。
我尝试过ServletContext,ApplicationContext没有成功。我意识到我可以从HttpServletRequest获取它但我在我的过滤器类中无法访问它。
请帮忙。我被卡住了。我来自.NET世界。这在那里很容易。
答案 0 :(得分:2)
根据您的Servlet版本,如果没有请求,您可能无法获得它。在Servlet 2.5之前,它假设servlet可能有多个上下文路径,因此您只能从请求中获取它。这在2.5中已更改,并添加了ServletContext.getContexPath()
。
如果您在doFilter()中需要此功能,则可以访问该请求。如果您真的想在Tomcat 5.5或更早版本的init()
中执行此操作,则可以执行hack,
String contextPath = ((org.apache.catalina.core.ApplicationContext)filterConfig.getSevletContext()).getContextPath();
当然,这不可移植。
答案 1 :(得分:1)
答案 2 :(得分:0)
您正在寻找的部分是contextPath,直到Servlet版本2.5,获取contextPath的唯一方法是通过在HttpServletRequest类上调用方法getContextPath()。这意味着您只能按要求获取一个请求。这与您的webapp可以映射到多个contextPath的事实有关。从版本2.5开始,您可以从ServletContext类获取contextPath,如果您的webapp映射到多个contextPath,您将获得主要或首选的contextPath(由容器决定)。
通常情况下,您希望在过滤器或servlet中的init()方法中了解contextPath。使用2.5版本,你可以,但是你将无法支持被映射到多个contextPath(虽然这很少是一个问题)。
答案 3 :(得分:0)
如果您只想将用户转发到根上下文,则可以在过滤器的doFilter
方法中执行此操作。这假设您从Filter init方法中的FilterConfig中抓取context
。
context.getRequestDispatcher("/").forward(request, response);
路径名必须以“/”开头,并且被解释为相对于当前上下文根。
如果您确实希望字符串对其执行某些操作,那么大多数其他解决方案就足够了。
答案 4 :(得分:0)
之前有人提到过hack,它允许您使用Catalina ApplicationContext对象来获取上下文路径。
String contextPath = ((org.apache.catalina.core.ApplicationContext)filterConfig.getSevletContext()).getContextPath();
您也可以在ServletContextListener中使用它,并在您的webapp启动时转储路径:
ApplicationContext tomcatContext = (ApplicationContext)event.getServletContext();
String contextPath = tomcatContext.getContextPath();
这些黑客可以使用,但只能使用Tomcat 5.5.16或更高版本的catalina.jar文件,因为该方法在以前的版本中没有实现。