我想在遇到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.
答案 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代理放在servlet容器(如Apache HTTP服务器)之前,您可以捕获从服务器发送的404并返回重定向(30x代码)。
如果你坚持使用servlet过滤器,这也是可行的。创建一个包装原始响应的过滤器,并进一步转发请求。从链中收到响应后,检查HTTP状态。如果是404,则重定向到搜索servlet。
答案 2 :(得分:0)
未经测试:ServletContext.getResourcePaths()
似乎列出了在给定路径上映射的资源。