我想创建一个jsp登录过滤器。jsp过滤器,获取页面名称
过滤器应:
- 拦截请求的任何页面;验证请求是否是一个登录会话
- 如果会话没有登录的一部分,客户端重定向到登录页面
- 如果请求的页面的登录页面,不要重定向,否则它将循环
在此先感谢
我想创建一个jsp登录过滤器。jsp过滤器,获取页面名称
过滤器应:
在此先感谢
滤波器的实现方案概述(无码,我假设你知道Servlet API的,这是前提)。
截取到任何页面的请求;验证请求是否是一个登录会话
你应该是创建Servlet过滤器的一部分,并将其映射对/*
,这样对应用程序的所有请求都将被该过滤器拦截。假定使用会话属性完成对已认证用户的跟踪。您可以从过滤器中的HttpServletRequest
对象中提取会话,并使用getAttribute()
方法提取属性。
如果会话没有登录,将客户端重定向到登录页面
如果会话或属性不存在,或者属性是假的,那么你就需要重定向用户登录到登录页面,使用HttpServletResponse对象上的sendRedirect()
方法。
如果请求的页面的登录页面,不要重定向,否则会循环
您可以确定该请求是否是使用getServletPath()方法在HttpServletRequest的登录页面目的。
/ApplicationContext/
目录*:但是,如果你做以下这是不必要的。/ApplicationContext/protected
目录中。/protected
而不是/*
。因此过滤器将拦截仅对受保护资源的请求。将任何资源映射到其他路径时要小心。* ApplicationContext是您的应用程序的上下文路径。如果您的网站是http://example.com/App
那么上下文通常是App
。因此,您的登录页面应为http://example.com/App/login.jsp
,而受保护的页面将被访问为http://example.com/App/protected/secret.jsp
将受限制的页面放入特定的文件夹中,例如,/secured
,/app
,/private
,/admin
等,并且将过滤器(或容器管理的安全约束)映射到完全覆盖该文件夹的URL模式,例如, /secured/*
,/app/*
,/private/*
,/admin/*
等。最后只需将登录页面放在该文件夹之外。
在our servlet filter wiki page你可以找到一个代码示例,其中涵盖了这种情况。
该死的,这是一个标签的巨大页面。 – 2011-06-13 14:58:43
谢谢你的确切答案。 1)为什么不使用request.getUserPrincipal()而不是“手动”将数据存储在属性中? 2)getServletPath()将在“欢迎文件”的情况下失败(也许其他jsf情况...?)。它将返回目录,而不是servlet名称 – AgostinoX 2011-06-13 14:38:41
request.getUserPrincipal()和request.getRemoteUser()将用于容器管理器身份验证。如果您正在使用该功能,请继续并替换谈话会话属性的步骤。如果你没有使用容器管理认证,并且已经推出了你的方案,那么这些方法将返回null。 – 2011-06-13 14:42:28
关于getServletPath()的主题,它在某些情况下会失败。我不记得哪个(可能是目录,正如你所说的)。这就是我提出分离内容的原因。 – 2011-06-13 14:43:14