【发布时间】:2011-09-13 23:17:13
【问题描述】:
我想创建一个 jsp 登录过滤器。
过滤器应该:
- 拦截任何页面的请求;验证请求是否是记录会话的一部分
- 如果会话未记录,则将客户端重定向到登录页面
- 如果请求的页面是登录页面,不要重定向,否则会循环
提前致谢
【问题讨论】:
标签: java security jsp servlets servlet-filters
我想创建一个 jsp 登录过滤器。
过滤器应该:
提前致谢
【问题讨论】:
标签: java security jsp servlets servlet-filters
将受限页面放在特定文件夹中,例如/secured、/app、/private、/admin 等并将过滤器(或容器管理的安全约束)映射到恰好覆盖该文件夹的 URL 模式上,例如/secured/*、/app/*、/private/*、/admin/* 等。最后只需将登录页面放在该文件夹之外。
在our servlet filter wiki page 中,您可以找到完全涵盖这种情况的代码示例。
【讨论】:
概述了过滤器的实现方案(没有代码;我假设您知道 Servlet API,这是先决条件)。
拦截对任何页面的请求;验证请求是否是记录会话的一部分
您应该创建 servlet 过滤器,并将其映射到 /*,以便应用程序的所有请求都将被此过滤器拦截。假定使用 Session 属性来跟踪经过身份验证的用户。您可以从过滤器内的HttpServletRequest 对象中提取会话,并使用getAttribute() 方法提取属性。
如果会话未记录,则将客户端重定向到登录页面
如果会话或属性不存在,或者属性为 false,那么您需要使用 HttpServletResponse 对象上的 sendRedirect() 方法将用户重定向到登录页面。
如果请求的页面是登录页面,不要重定向,否则会循环
您可以使用 HttpServletRequest 对象上的 getServletPath() 方法来确定请求是否到登录页面。但是,如果您执行以下操作,则这是不必要的:
/ApplicationContext/目录*中。/ApplicationContext/protected 目录中。/protected 而不是 /*。因此,过滤器将只拦截对受保护资源的请求。将任何资源映射到不同路径时要小心。* ApplicationContext 是您的应用程序的上下文路径。如果您的网站位于http://example.com/App,则上下文通常为App。因此,您的登录页面应为http://example.com/App/login.jsp,而受保护的页面将以http://example.com/App/protected/secret.jsp 访问
【讨论】: