RequestDispatcher.forward循环

时间:2009-07-01 14:29:07

标签: java jsp java-ee servlets

我正在使用

<url-pattern>/*</url-pattern>

将所有请求映射到一个sevlet,我在那里进行所有身份验证工作。 但是我想跳过一些静态内容(比如css文件)。所以我尝试了它们 那个sevlet到资源文件的位置

if(isResourceFile){
    RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("static/" + fileName);
    dispatcher.forward(request, response);
}

但这会启动无限循环,因为这将再次调用相同的sevlet

有没有办法解决这个问题,而没有映射web.xml中的所有资源(css)文件?

3 个答案:

答案 0 :(得分:1)

url-pattern的{​​{1}}最好由/*独占使用,而不是Filter。将所有静态文件放在某个文件夹中(可能由更有效FileServletServlet覆盖?)并让过滤器检查它。

E.g。 (伪)

url-pattern

希望这有帮助。

答案 1 :(得分:0)

假设您只想验证JSP文件,可以更改URL:

/*.jsp

我认为使用过滤器而不是servlet处理身份验证更好。在生产环境中,您应该使用前端Web服务器来获取静态内容。

答案 2 :(得分:0)

如果您不能使用过滤器,并且您必须在没有像'.jsp'这样的扩展名的映射中使用通配符'*',那么这可能对您有用:

if(isResourceFile){
      RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/static/" + fileName);
      dispatcher.forward(request, response);
      return; 
}

在静态目录的开头添加'/'将为其提供根上下文。