【问题标题】:JSF 2.0: How to get the URL that is entered in the browser's address barJSF 2.0:如何获取在浏览器地址栏中输入的 URL
【发布时间】:2011-05-05 13:14:09
【问题描述】:

我的 JSF 应用程序将任何未登录的用户重定向到登录页面。当用户登录时,我希望应用程序重定向到用户最初在浏览器地址栏中输入的页面。但我不知道如何访问用户最初输入的 url,因为他会自动重定向到我在 web.xml 中配置的登录页面。

【问题讨论】:

  • 那么,您正在使用容器管理的安全性,如j_security_check?
  • 是的,我正在使用容器管理的安全性。但是在登录时,我使用的是 HttpServletRequest.login(username, password) 而不是 j_security_check。
  • 提示,使用@nickname@BalusC 来通知其他人关于不是他们自己的帖子上的cmets。否则,您将取决于该主题是否稍后会回顾(通常不会)。另见meta.stackexchange.com/questions/43019/…
  • @BalusC 感谢您的提示,不知道。

标签: jsf jsf-2


【解决方案1】:

容器管理的安全性没有为此提供任何 API 工具。最好的办法是将<login-config> 替换为Filter 类,大致如下:

HttpServletRequest httpreq = (HttpServletRequest) request;
HttpServletResponse httpres = (HttpServletResponse) response;
if (httpreq.getUserPrincipal() == null) {
    httpreq.getSession().setAttribute("from", httpreq.getRequestURI());
    httpres.sendRedirect("login.jsf");
} else {
    chain.doFilter(request, response);
}

然后在您的登录中:

request.login(username, password);
externalContext.redirect((String) request.getSession().getAttribute("from"));

【讨论】:

  • 我刚刚挖掘了这个答案,考虑了this question 的过滤器。很好的答案,当然。没有用于此的 API 真的很糟糕——这似乎是一个足够常见的用例。我很好奇:如果您从web.xml 中删除<login-config>request.login(username, password); 仍然有效吗?怎么样?
  • @Matt:是的,它会起作用的。它只是新的 Servlet 3.0 编程替换,它与 <login-config> 相同(结合过滤器的 <url-pattern>)。但是,您仍然必须将 <security-constraint> 条目和用户/密码/角色保留在一个领域中。
  • 应该如何在部署描述符中设置 login-config 才能正常工作?如果我删除表单身份验证,Web 浏览器会将 request.userPrincipal 设置为缓存值,因此 (httpreq.getUserPrincipal() == null) 将为 false。如果我确实打开了表单身份验证,则过滤器根本不会运行,因为容器会接管。
  • @Ramsus:它应该被删除。答案还指出“用这个过滤器替换登录配置”。对于具有缓存值的浏览器设置,您可能需要关闭受保护页面的浏览器缓存(可以在相同的过滤器中完成)。
  • 如果您使用的是 GlassFish 3 服务器,则需要删除添加到域的 default-web.xml 文件中的 login-config 元素。请参阅stackoverflow.com/questions/10126792/… 了解更多信息。
猜你喜欢
  • 2013-07-04
  • 1970-01-01
  • 2010-12-24
  • 1970-01-01
  • 2015-01-11
  • 2015-02-09
  • 1970-01-01
  • 1970-01-01
  • 2015-01-15
相关资源
最近更新 更多