【问题标题】:jsp filter, get page namejsp过滤,获取页面名称
【发布时间】:2011-09-13 23:17:13
【问题描述】:

我想创建一个 jsp 登录过滤器。

过滤器应该:

  • 拦截任何页面的请求;验证请求是否是记录会话的一部分
  • 如果会话未记录,则将客户端重定向到登录页面
  • 如果请求的页面是登录页面,不要重定向,否则会循环

提前致谢

【问题讨论】:

    标签: java security jsp servlets servlet-filters


    【解决方案1】:

    将受限页面放在特定文件夹中,例如/secured/app/private/admin 等并将过滤器(或容器管理的安全约束)映射到恰好覆盖该文件夹的 URL 模式上,例如/secured/*/app/*/private/*/admin/* 等。最后只需将登录页面放在该文件夹之外。

    our servlet filter wiki page 中,您可以找到完全涵盖这种情况的代码示例。

    【讨论】:

    • 该死,标签页太大了。
    【解决方案2】:

    概述了过滤器的实现方案(没有代码;我假设您知道 Servlet API,这是先决条件)。

    拦截对任何页面的请求;验证请求是否是记录会话的一部分

    您应该创建 servlet 过滤器,并将其映射到 /*,以便应用程序的所有请求都将被此过滤器拦截。假定使用 Session 属性来跟踪经过身份验证的用户。您可以从过滤器内的HttpServletRequest 对象中提取会话,并使用getAttribute() 方法提取属性。

    如果会话未记录,则将客户端重定向到登录页面

    如果会话或属性不存在,或者属性为 false,那么您需要使用 HttpServletResponse 对象上的 sendRedirect() 方法将用户重定向到登录页面。

    如果请求的页面是登录页面,不要重定向,否则会循环

    您可以使用 HttpServletRequest 对象上的 getServletPath() 方法来确定请求是否到登录页面。但是,如果您执行以下操作,则这是不必要的:

    • 将登录页面和其他“公共”内容放在文档根目录下,即/ApplicationContext/目录*中。
    • 将受保护的内容(包括所有 servlet 映射)放在/ApplicationContext/protected 目录中。
    • 仅将过滤器映射到 /protected 而不是 /*。因此,过滤器将只拦截对受保护资源的请求。将任何资源映射到不同路径时要小心。

    * ApplicationContext 是您的应用程序的上下文路径。如果您的网站位于http://example.com/App,则上下文通常为App。因此,您的登录页面应为http://example.com/App/login.jsp,而受保护的页面将以http://example.com/App/protected/secret.jsp 访问

    【讨论】:

    • 感谢您的准确回答。 1)为什么不使用 request.getUserPrincipal() 而不是“手动”将数据存储在属性中? 2) getServletPath() 将在“欢迎文件”的情况下失败(可能是其他 jsf 情况......?)。它将返回目录,而不是 servlet 名称
    • request.getUserPrincipal() 和 request.getRemoteUser() 将用于容器管理器身份验证。如果您正在使用它,请继续并替换讨论会话属性的步骤。如果您没有使用容器管理的身份验证,并且已经滚动了您的方案,那么这些方法将返回 null。
    • 关于getServletPath()的话题,在某些场景下会失败。我不记得是哪个(可能是您提到的目录)。这就是我建议分离内容的原因。
    • @BalusC,不,它没有。 getRemoteUser() 调用 getUserPrincipal().getName() 或等效项。仅为 getRemoteAddr() 返回 IP。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    • 2012-06-22
    • 2014-03-14
    相关资源
    最近更新 更多