覆盖JSP servlet(过滤“* .jsp”)以包装在身份验证模型中

时间:2009-11-25 10:23:31

标签: java jsp servlets servlet-filters

可以以某种方式扩展在* .jsp(org.apache.jasper.servlet.JspServlet在Tomcat 6中)上过滤的JSP servlet,以便每当有人进入JSP页面时,我都可以进行一些服务器端身份验证来检查是否用户可以查看该页面。我们当前的技术是一个常见包含中的taglib,它被导入到每个JSP页面中,但它不是很优雅。

这里的关键是我不想重新发明轮子并担心将JSP编译成Servlet,我最好用super.meth()委托每个方法。

我一直在搜索Google,但我不知道使用正确的关键字。任何包含JSP和Servlet的内容都会返回初学者教程。

谢谢,

约翰

4 个答案:

答案 0 :(得分:3)

查看Servlet Filters,并在转发到某个JSP或Servlet之前使用该过滤器。

答案 1 :(得分:3)

如果没有利用Java EE提供的容器托管安全性,那么通常的基本做法是将登录的User存储在会话范围中,并在所需的{上使用Filter {1}}检查url-pattern是否已登录。

以下是获取图片的基本示例:

登录:

User

过滤器(映射到例如User user = userDAO.find(username, password); if (user != null) { session.setAttribute("user", user); } else { // Do your thing to show "Unknown login" error. } /secured/*等的url模式,其中放置受限制的JSP页面期望登录页面:

/protected/*

注销:

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.
}

当然,您也可以利用Java EE开箱即用provides的安全性。常用的方法是声明容器管理的安全性,您可以在其中指定用户和角色。您只需在session.removeAttribute("user"); // Or, a bit too drastically: session.invalidate(); 中声明<security-constraint><login-config>,然后在appserver中配置用户域。细节取决于所使用的appserver,但如果它是例如Tomcat 6.0,那么你可以找到here一些关于它的文档。

答案 2 :(得分:2)

如果基本身份验证不充分,那么Spring Security可能会更好。这很自然,特别是如果你已经在使用Spring了。一个很大的优点是它是声明性的,因此只需将URL添加到安全配置中即可轻松保护URL。

通过继承执行此操作会很脆弱,并且每次修改安全性时都需要更改代码。最好将安全作为一个贯穿各领域的问题。

答案 3 :(得分:1)

你能不能创建另一个过滤器并把它放在JspServlet上面? 如果出现问题,此过滤器会检查您的安全资料并进行一些处理(例如重定向到登录页面)。