Servlet过滤器:在没有servlet映射时进行搜索

时间:2011-10-18 16:27:27

标签: java servlets servlet-filters

我想在遇到404时运行搜索。例如,用户想查看有意大利菜的餐馆,他们会去www.mywebsite.com/italian,所以我想添加一个过滤器,首先检查404是否已经过抛出,如果是,则尝试搜索搜索项列表,如果存在匹配,则向该页面转发请求而不是抛出404错误。

示例:

www.mywebsite.com/italian  --> www.mywebsite.com/search.do?cuisine=italian
www.mywebsite.com/london   --> www.mywebsite.com/search.do?city=london 
www.mywebsite.com/rest     --> www.mywebsite.com/show.do?rest_id=XXX

我想问的是如何确定服务器配置中是否存在url-mapping "/italian""/italian/*"的servlet?

使用(在Filter.doFilter中)request.getRequestDispatcher(request.getRequestURI())始终返回一个非空值,我不能用它来确定请求是否有效。我可以使用404错误语句,但结果的响应状态为404而不是200.

3 个答案:

答案 0 :(得分:6)

您只需在servlet URL模式上映射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>

这允许在显示所需的JSP之前在servlet中执行细粒度业务和HTTP请求/响应控制作业。

答案 1 :(得分:1)

我至少可以想到两种实现方法:

<error-page>

web.xml添加:

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

/notfound应该是一个现有的servlet /控制器,可以访问原始URL(未找到的URL,例如/italian):

request.getAttribute("javax.servlet.error.request_uri")

在此控制器中,您可以将重定向发送到/search.do

HTTP代理

如果您将HTTP代理放在servlet容器(如Apache HTTP服务器)之前,您可以捕获从服务器发送的404并返回重定向(30x代码)。

Servlet后过滤器

如果你坚持使用servlet过滤器,这也是可行的。创建一个包装原始响应的过滤器,并进一步转发请求。从链中收到响应后,检查HTTP状态。如果是404,则重定向到搜索servlet。

答案 2 :(得分:0)

未经测试:ServletContext.getResourcePaths()似乎列出了在给定路径上映射的资源。