首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RequestDispatcher.forward循环

RequestDispatcher.forward循环
EN

Stack Overflow用户
提问于 2009-07-01 14:29:07
回答 3查看 4K关注 0票数 2

我正在使用

代码语言:javascript
复制
<url-pattern>/*</url-pattern>

将所有请求映射到一个sevlet,我在其中执行所有身份验证工作。但是我想跳过一些静态内容(比如css文件).so,我试着把它们从那个sevlet查找到资源文件所在的位置。

代码语言:javascript
复制
if(isResourceFile){
    RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("static/" + fileName);
    dispatcher.forward(request, response);
}

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

有没有办法在不映射web.xml中的所有资源(Css)文件的情况下解决这个问题?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-07-01 14:33:47

假设您只希望对JSP文件进行身份验证,则可以更改URL:

代码语言:javascript
复制
/*.jsp

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

票数 0
EN

Stack Overflow用户

发布于 2009-11-18 07:50:25

/*url-pattern最好由Filters独占使用,而不是Servlets。将所有静态文件放在某个文件夹中(也许会被更有效的FileServleturl-pattern所覆盖?)并让过滤器检查它。

例如(伪)

代码语言:javascript
复制
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.
    }
}

希望这能有所帮助。

票数 1
EN

Stack Overflow用户

发布于 2009-11-18 04:04:23

如果你不能使用过滤器,并且你必须在映射中使用通配符'*‘,而不是像'.jsp’这样的扩展名,那么这对你来说是可行的:

代码语言:javascript
复制
if(isResourceFile){
      RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/static/" + fileName);
      dispatcher.forward(request, response);
      return; 
}

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1069442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档