2011-06-13 99 views
1

我想创建一个jsp登录过滤器。jsp过滤器,获取页面名称

过滤器应:

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

在此先感谢

回答

1

滤波器的实现方案概述(无码,我假设你知道Servlet API的,这是前提)。

截取到任何页面的请求;验证请求是否是一个登录会话

你应该是创建Servlet过滤器的一部分,并将其映射对/*,这样对应用程序的所有请求都将被该过滤器拦截。假定使用会话属性完成对已认证用户的跟踪。您可以从过滤器中的HttpServletRequest对象中提取会话,并使用getAttribute()方法提取属性。

如果会话没有登录,将客户端重定向到登录页面

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

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

您可以确定该请求是否是使用getServletPath()方法在HttpServletRequest的登录页面目的。

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

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

+0

谢谢你的确切答案。 1)为什么不使用request.getUserPrincipal()而不是“手动”将数据存储在属性中? 2)getServletPath()将在“欢迎文件”的情况下失败(也许其他jsf情况...?)。它将返回目录,而不是servlet名称 – AgostinoX 2011-06-13 14:38:41

+0

request.getUserPrincipal()和request.getRemoteUser()将用于容器管理器身份验证。如果您正在使用该功能,请继续并替换谈话会话属性的步骤。如果你没有使用容器管理认证,并且已经推出了你的方案,那么这些方法将返回null。 – 2011-06-13 14:42:28

+0

关于getServletPath()的主题,它在某些情况下会失败。我不记得哪个(可能是目录,正如你所说的)。这就是我提出分离内容的原因。 – 2011-06-13 14:43:14

1

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

our servlet filter wiki page你可以找到一个代码示例,其中涵盖了这种情况。

+0

该死的,这是一个标签的巨大页面。 – 2011-06-13 14:58:43