我正在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映射阶段之前拦截事物。
答案 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
。