JSP RequestDispatcher.forward循环

baubqpgj  于 2023-06-20  发布在  其他
关注(0)|答案(3)|浏览(120)

我在用

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

将所有请求Map到一个sevlet,在这里我执行所有的身份验证工作。但我想跳过一些静态内容(如css文件)。所以我试图fowrding他们从该sevlet的资源文件是

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

但这将启动一个无限循环,因为这将再次调用相同的sevlet
有没有什么方法可以不Mapweb.xml中的所有资源(css)文件来解决这个问题?

eni9jsuy

eni9jsuy1#

/*url-pattern最好由Filter s独占使用,而不是Servlet s。把你所有的静态文件放在一个特定的文件夹中(也许被一个更有效的FileServleturl-pattern覆盖?),并让过滤器检查它。
例如(伪)

public void doFilter(request, response, chain) {
    if (requestURI.startsWith("/static")) {
        chain.doFilter(request, response); // Just continue. Do nothing.
    } else {
        request.getRequestDispatcher("/pages").forward(request, response); // Forward to page controller.
    }
}

另请参阅:

mzsu5hc0

mzsu5hc02#

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

/*.jsp

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

oxcyiej7

oxcyiej73#

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

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

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

相关问题