Java EE 6 安全性和重定向

Posted

技术标签:

【中文标题】Java EE 6 安全性和重定向【英文标题】:Java EE 6 security and redirection 【发布时间】:2013-02-19 03:17:18 【问题描述】:

我有一个在 JBoss 7.1.1 上运行的 Java EE 6 Web 应用程序,其中一些页面需要身份验证,而许多页面不需要。对于经过身份验证的页面,我使用的是 this previous post 中所述的 Servlet 3.0 Programmatic Security。

在我的 web.xml 中,我有以下条目

<login-config>
  <auth-method>FORM</auth-method>
  <form-login-config>
    <form-login-page>/login</form-login-page>
    <form-error-page>/loginError</form-error-page>
  </form-login-config>
</login-config>

在我的 Login 类中,我有一个用 @PostConstruct 注释的方法,在该方法中捕获了请求的页面: String previousURL = (String) FacesContext.getCurrentInstance().getExternalContext().getRequestMap().get(RequestDispatcher.FORWARD_QUERY_STRING)

但是,它评估的是 /login 页面本身,而不是用户请求的页面,并且由于 web.xml 中的登录配置设置,JBoss然后将其转发到该页面。结果,当我转发到 previousURL 时,它只是将我带回到登录页面,而不是用户最初单击的页面。我究竟做错了什么?

【问题讨论】:

【参考方案1】:

您正在尝试检索错误的属性。您应该尝试检索的是RequestDispatcher.FORWARD_REQUEST_URI,它是一个实际的URI。您当前要检索的是请求的 url 之后的查询字符串(基本上是实际 URL 之后的任何内容;?param=1 等)

【讨论】:

感谢您的关注。更改后,我仍然会得到 /login 页面的 previousURL,而不是我最初请求的页面。 您肯定@Anand 提供的用户凭据已成功通过身份验证? 我想是的。这是来自 JBoss 的日志条目:Excuting query: select password from PRINCIPAL where username = ?, with username: admin ... User 'admin' authenticated, loginOk=true commit, loginOk=true ... Assign user to role Administration ... User: admin is authenticated

以上是关于Java EE 6 安全性和重定向的主要内容,如果未能解决你的问题,请参考以下文章

java web开发中的转发和重定向问题的理解,要的是理解

java转发和重定向

servlet转发和重定向

[Java][Web] Servlet中转发和重定向比较

java的跳转和重定向,加载显示层

java手记------------------------java中转发和重定向区别