jsp过滤,获取页面名称

Posted

技术标签:

【中文标题】jsp过滤,获取页面名称【英文标题】:jsp filter, get page name 【发布时间】:2011-09-13 23:17:13 【问题描述】:

我想创建一个 jsp 登录过滤器。

过滤器应该:

拦截任何页面的请求;验证请求是否是记录会话的一部分 如果会话未记录,则将客户端重定向到登录页面 如果请求的页面是登录页面,不要重定向,否则会循环

提前致谢

【问题讨论】:

【参考方案1】:

将受限页面放在特定文件夹中,例如/secured/app/private/admin 等并将过滤器(或容器管理的安全约束)映射到恰好覆盖该文件夹的 URL 模式上,例如/secured/*/app/*/private/*/admin/* 等。最后只需将登录页面放在该文件夹之外。

在our servlet filter wiki page 中,您可以找到完全涵盖这种情况的代码示例。

【讨论】:

该死,标签页太大了。【参考方案2】:

概述了过滤器的实现方案(没有代码;我假设您知道 Servlet API,这是先决条件)。

拦截对任何页面的请求;验证请求是否是记录会话的一部分

您应该创建 servlet 过滤器,并将其映射到 /*,以便应用程序的所有请求都将被此过滤器拦截。假定使用 Session 属性来跟踪经过身份验证的用户。您可以从过滤器内的HttpServletRequest 对象中提取会话,并使用getAttribute() 方法提取属性。

如果会话未记录,则将客户端重定向到登录页面

如果会话或属性不存在,或者属性为 false,那么您需要使用 HttpServletResponse 对象上的 sendRedirect() 方法将用户重定向到登录页面。

如果请求的页面是登录页面,不要重定向,否则会循环

您可以使用 HttpServletRequest 对象上的 getServletPath() 方法来确定请求是否到登录页面。但是,如果您执行以下操作,则这是不必要的:

将登录页面和其他“公共”内容放在文档根目录下,即/ApplicationContext/目录*中。 将受保护的内容(包括所有 servlet 映射)放在/ApplicationContext/protected 目录中。 仅将过滤器映射到 /protected 而不是 /*。因此,过滤器将只拦截对受保护资源的请求。将任何资源映射到不同路径时要小心。

* ApplicationContext 是您的应用程序的上下文路径。如果您的网站位于http://example.com/App,则上下文通常为App。因此,您的登录页面应为http://example.com/App/login.jsp,而受保护的页面将以http://example.com/App/protected/secret.jsp 访问

【讨论】:

感谢您的准确回答。 1)为什么不使用 request.getUserPrincipal() 而不是“手动”将数据存储在属性中? 2) getServletPath() 将在“欢迎文件”的情况下失败(可能是其他 jsf 情况......?)。它将返回目录,而不是 servlet 名称 request.getUserPrincipal() 和 request.getRemoteUser() 将用于容器管理器身份验证。如果您正在使用它,请继续并替换讨论会话属性的步骤。如果您没有使用容器管理的身份验证,并且已经滚动了您的方案,那么这些方法将返回 null。 关于getServletPath()的话题,在某些场景下会失败。我不记得是哪个(可能是您提到的目录)。这就是我建议分离内容的原因。 @BalusC,不,它没有。 getRemoteUser() 调用 getUserPrincipal().getName() 或等效项。仅为 getRemoteAddr() 返回 IP。

以上是关于jsp过滤,获取页面名称的主要内容,如果未能解决你的问题,请参考以下文章

在jsp页面中如何获取另一个jsp页面提交的信息

在servlet中查询数据库并在页面显示查询的结果

如果记录已经存在于jsp页面的表中,如何获取错误消息

filter过滤器配置如何不过滤一些页面

servlet和jsp页面过滤器Filter的作用及配置

jsp页面显示中文为问号的问题(乱码问题)