如何制作过滤器以检测用户是不是请求了未找到的页面?

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 帐户设置?

如何检测用户是不是使用后退按钮进入页面?

如何检测用户是不是在 c# 中摇晃(检测摇晃),

Spring Security +自定义用户对象附加到会话以过滤请求

如何在(Jasper Studio)的 mongo DB 查询中制作动态/可选过滤器(参数)

检测是不是在手机上运行[重复]