Servlet映射:仅当文件或目录不存在时?

时间:2010-12-08 21:35:27

标签: java servlets java-ee glassfish glassfish-3

我正在GlassFish上设置一个Web应用程序,我想知道是否有一种方法可以从URL根配置servlet映射,仅适用于指定URL中不存在文件或目录的情况。

目前,这将通过我的Spring调度程序路由所有内容:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
           version="3.0">
 <servlet>
  <servlet-name>dispatcher</servlet-name>
  <servlet-class>
   org.springframework.web.servlet.DispatcherServlet
  </servlet-class>
  <load-on-startup>1</load-on-startup>
 </servlet>
 <servlet-mapping>
  <servlet-name>dispatcher</servlet-name>
  <url-pattern>/</url-pattern>
 </servlet-mapping>
 <welcome-file-list>
  <welcome-file>
   /jsp/index.jsp
  </welcome-file>
 </welcome-file-list>
</web-app>

除非在给定路径中存在文件或目录,否则以某种方式可以保留上述行为?我试图在错误的地方解决这个问题吗?

更新:URL重写怎么样? GlassFish是否像Apache一样使用mod_rewrite提供任何程度的灵活性?这样我就可以在它到达servlet映射阶段之前拦截事物。

1 个答案:

答案 0 :(得分:1)

Hacky,但可行:将<error-page>映射到<error-code> 404

<servlet>
    <servlet-name>errorServlet</servlet-name>
    <servlet-class>com.example.ErrorServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>errorServlet</servlet-name>
    <url-pattern>/error</url-pattern>
</servlet-mapping>

<error-page>
    <error-code>404</error-code>
    <location>/error</location>
</error-page>

如果要返回“有效”响应,可能需要更改servlet中的状态代码。

另一种方法是让Spring servlet监听更具体的url-pattern。例如。 /pages/*。然后,如有必要,您可以在Filter前面加/*,大致如下:

if (new File(servletContext.getRealPath(request.getRequestURI())).exists()) {
    chain.doFilter(request, response);
} else {
    request.getRequestDispatcher("/pages" + request.getRequestURI()).forward(request, response);
}

这样您就不会在网址中看到/需要/pages


更新:根据您的新问题:

  

更新:URL重写怎么样? GlassFish是否像Apache一样使用mod_rewrite提供任何程度的灵活性?这样我就可以在它到达servlet映射阶段之前拦截事物。

Apache HTTPD的mod_rewrite插件的JSP / Servlet等效于Tuckey's UrlRewriteFilter