覆盖 JSP servlet(过滤器“*.jsp”)以包装身份验证模型
Posted
技术标签:
【中文标题】覆盖 JSP servlet(过滤器“*.jsp”)以包装身份验证模型【英文标题】:Overriding the JSP servlet (filter "*.jsp") to wrap in an authentication model 【发布时间】:2010-12-20 05:46:07 【问题描述】:过滤 *.jsp 的 JSP servlet(Tomcat 6 中的 org.apache.jasper.servlet.JspServlet)能否以某种方式扩展,因此每当有人访问 JSP 页面时,我都可以进行一些服务器端身份验证来检查是否用户可以查看页面。我们目前的技术是在一个公共包含中的标记库,它被导入到每个 JSP 页面中,但它不是很优雅。
这里的关键是我不想重新发明***并担心将 JSP 编译成 Servlet,我希望在每个方法中使用 super.meth() 进行委托。
我一直在搜索 Google,但我不知道要使用正确的关键字。任何包含 JSP 和 Servlet 的内容都会返回初学者教程。
谢谢,
约翰
【问题讨论】:
【参考方案1】:查看Servlet Filters,并在转发到某个 JSP 或 Servlet 之前使用该过滤器。
【讨论】:
宾果游戏,正是医生吩咐的。谢谢!约翰【参考方案2】:当不利用 Java EE 提供的容器管理安全性时,通常的基本做法是将登录的 User
存储在会话范围内,并在所需的 url-pattern
上使用 Filter
来检查如果User
已登录。
这是获取图片的基本示例:
登录:
User user = userDAO.find(username, password);
if (user != null)
session.setAttribute("user", user);
else
// Do your thing to show "Unknown login" error.
过滤器(映射到例如 /secured/*
、/protected/*
等的 url 模式上,其中您放置受限 JSP 页面期望登录页面):
User user = session.getAttribute("user");
if (user != null)
chain.doFilter(request, response); // Logged in, so continue with request.
else
response.sendRedirect("login"); // Not logged in, redirect to login page.
退出:
session.removeAttribute("user");
// Or, a bit too drastically:
session.invalidate();
当然,您也可以从 Java EE provides 的安全性方面受益。一种常用的方式是声明性容器管理的安全性,您可以在其中指定用户和角色。您只需要在web.xml
中声明一个<security-constraint>
和一个<login-config>
,并在appserver 中配置一个用户领域。详细信息取决于所使用的应用服务器,但如果是例如 Tomcat 6.0,那么您可以找到 here 一些相关文档。
【讨论】:
【参考方案3】:如果基本身份验证还不够,也许Spring Security 会更好。这是很自然的,特别是如果您已经在使用 Spring。一大优势是它是声明性的,因此您只需将 URL 添加到安全配置中即可轻松保护它们。
通过继承执行此操作会很脆弱,并且每次修改安全性时都需要更改代码。最好将安全作为跨领域关注点。
【讨论】:
【参考方案4】:你不能创建另一个过滤器并将其放在 JspServlet 之上吗? 如果出现问题,此过滤器会检查您的安全内容并进行一些处理(例如重定向到登录页面)。
【讨论】:
我认为他已经没有任何过滤器了。他只是将“过滤器”这个词用作动词,而实际上是在谈论 JSP。 ;) 你是对的 - 我使用过滤器作为通用动词来涵盖检查 URI 的内容。我没有意识到(或没有想到)Servlet 过滤器!以上是关于覆盖 JSP servlet(过滤器“*.jsp”)以包装身份验证模型的主要内容,如果未能解决你的问题,请参考以下文章