Java jsp过滤器,获取页面名称

Java jsp过滤器,获取页面名称,java,security,jsp,servlets,servlet-filters,Java,Security,Jsp,Servlets,Servlet Filters,我想创建一个jsp登录过滤器 过滤器应: 拦截对任何页面的请求;验证请求是否是已记录会话的一部分 如果未记录会话,请将客户端重定向到登录页面 如果请求的页面是登录页面,不要重定向,否则它将循环 提前感谢概述了过滤器的实现方案(没有代码;我假设您知道Servlet API,这是一个先决条件) 拦截对任何页面的请求;验证请求是否是已记录会话的一部分 您应该创建servlet过滤器,并将其映射到/*,这样所有对应用程序的请求都将被该过滤器拦截。假定使用会话属性跟踪经过身份验证的用户。您可以从筛选器

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

过滤器应:

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

提前感谢

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

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

您应该创建servlet过滤器,并将其映射到
/*
,这样所有对应用程序的请求都将被该过滤器拦截。假定使用会话属性跟踪经过身份验证的用户。您可以从筛选器中的
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

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


在中,您可以找到一个代码示例,该示例正好涵盖了这种情况。

谢谢您的精确回答。1) 为什么不使用request.getUserPrincipal()而不是“手动”将数据存储在属性中?2) getServletPath()将在“欢迎文件”的情况下失败(可能是其他jsf情况…?)。它将返回目录,而不是servlet namerequest.getUserPrincipal()和request.getRemoteUser()将用于容器管理器身份验证。如果您正在使用它,请继续并替换讨论会话属性的步骤。如果您没有使用容器管理的身份验证,并且已经滚动了您的方案,那么这些方法将返回null。在getServletPath()主题上,它将在某些情况下失败。我不记得是哪一个(可能是目录,正如你提到的)。这就是我建议将内容分开的原因。@BalusC,不,没有。getRemoteUser()调用getUserPrincipal().getName()或等效项。只为getRemoteAddr()返回IP。该死,对于标签来说,这是一个巨大的页面。