如何制作过滤器以检测用户是不是请求了未找到的页面?
Posted
技术标签:
【中文标题】如何制作过滤器以检测用户是不是请求了未找到的页面?【英文标题】:How to make a filter to detect if the user requested a page that is not found?如何制作过滤器以检测用户是否请求了未找到的页面? 【发布时间】:2011-05-18 11:21:45 【问题描述】:我想在我的应用程序中创建一个过滤器,以便在每次请求之前检测请求的页面是否存在。如果它不存在,它会将用户转发到错误页面。
如何检测页面是否存在?
我需要一个带有过滤器而不是使用 web.xml 标记方法的解决方案。
【问题讨论】:
【参考方案1】:可以直接在web.xml中配置
<error-page>
<error-code>404</error-code>
<location>/yourCustom404.jsp</location>
</error-page>
或者 创建一个过滤器和 使用HTTPURLConnection 以编程方式检测页面是否存在。
【讨论】:
我已经知道这个简单的解决方案,我想问题很清楚,我必须用过滤器做出这样的解决方案。 但是,为什么您要为此使用过滤器? 问题在这里:***.com/questions/4153438/… 我不能使用制作两种不同模式的解决方案,一种是安全的,另一种是匿名的,所以我想过滤器在这里可能有用,你怎么看? 那么您是否涉及身份验证(这会使事情复杂化)?【参考方案2】:如果您没有身份验证,则可以。
-
创建
Filter
使用HttpServletResponseWrapper 并覆盖sendError()
和setStatus()
通过chain.doFilter(req, wrapper)
传递包装的响应
如果您的包装器中有 sendError()
,请查看它是否为 404。
采取适当的应对措施。
您可能还必须覆盖 getOutputStream()
和 getWriter()
以避免在您有机会做某事之前将响应刷新到客户端。
【讨论】:
你觉得博卓的方案怎么样,我觉得还不错。 我猜HttpURLConnection
的作用类似于http://foo/some/stuff
的传入请求——被过滤器拦截,为http://foo/some/stuff?disableFilter=true
创建一个HttpURLRequest——过滤器让这个请求通过。这取决于情况——这个解决方案会创建很多额外的套接字,所以取决于负载可能不是很好(HttpURLConnection 不做保持活动,所以如果你有很高的负载,你最终会在 CLOSED_WAIT 中有很多套接字)。
@sword, @bozho: 使用HttpURLConnection
只会导致过滤器中的无限循环,因为 same 过滤器会再次被调用......你需要在请求 URL 中添加一些参数并让过滤器拦截它以避免再次调用 HttpURLConnection
。
@BalusC 看看我的回复...通知?disableFilter=true
【参考方案3】:
“页面存在”不是一件小事。页面不必作为文件物理存在。
除了org.life.java提到的使用HttpURLConnection
模拟请求的选项,你可以创建一个HttpServletResponseWrapper
,覆盖setStatus
方法,并且每当它设置为404
时,需要额外的措施。
【讨论】:
以上是关于如何制作过滤器以检测用户是不是请求了未找到的页面?的主要内容,如果未能解决你的问题,请参考以下文章
如何在请求会话之前检测用户是不是有 iOS 集成 Facebook 帐户设置?
Spring Security +自定义用户对象附加到会话以过滤请求