覆盖 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”)以包装身份验证模型的主要内容,如果未能解决你的问题,请参考以下文章

JSP-Runoob:JSP 过滤器

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

servlet 过滤器在 JSP 中不起作用

servlet 过滤器如何识别下一个目标是另一个过滤器还是 servlet/jsp?

Servlet和JSP中的过滤器都是Java类

jsp+servlet怎样防止用户用URL直接访问页面