jsp过滤,获取页面名称
Posted
技术标签:
【中文标题】jsp过滤,获取页面名称【英文标题】:jsp filter, get page name 【发布时间】:2011-09-13 23:17:13 【问题描述】:我想创建一个 jsp 登录过滤器。
过滤器应该:
拦截任何页面的请求;验证请求是否是记录会话的一部分 如果会话未记录,则将客户端重定向到登录页面 如果请求的页面是登录页面,不要重定向,否则会循环提前致谢
【问题讨论】:
【参考方案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。以上是关于jsp过滤,获取页面名称的主要内容,如果未能解决你的问题,请参考以下文章