Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JSF2.0:如何获取在浏览器中输入的URL';s地址栏_Jsf_Jsf 2 - Fatal编程技术网

JSF2.0:如何获取在浏览器中输入的URL';s地址栏

JSF2.0:如何获取在浏览器中输入的URL';s地址栏,jsf,jsf-2,Jsf,Jsf 2,我的JSF应用程序将所有未登录的用户重定向到登录页面。当用户登录时,我希望应用程序重定向到用户最初在浏览器地址栏中输入的页面。但是我不知道如何访问用户最初输入的url,因为他会自动重定向到我在web.xml中配置的登录页面。容器管理安全性没有为此提供任何API功能。最好的办法是用一个大致如下所示的过滤器类替换: HttpServletRequest httpreq = (HttpServletRequest) request; HttpServletResponse httpres = (Htt

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

容器管理安全性没有为此提供任何API功能。最好的办法是用一个大致如下所示的
过滤器
类替换

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"));

那么,您使用的是容器管理的安全性,就像在
j_security\u check
中一样?是的,我使用的是容器管理的安全性。但是在登录时,我使用的是HttpServletRequest.login(用户名、密码)而不是j_security_check.Hint,请使用
@昵称
@BalusC
一样通知其他人关于非自己帖子的评论。否则,您将取决于该用户是否会在稍后的主题中回顾(通常不会)。另请参阅@BalusC谢谢你的提示,我不知道。我只是把这个答案翻了回来,考虑一下过滤器的问题。当然,回答得很好。它真的很糟糕,没有API用于此-它似乎是一个足够常见的用例。我很好奇:如果从
web.xml
中删除
,是否
请求.login(用户名、密码)仍然工作吗?怎么做?马特:是的,它会起作用的。它只是新的Servlet 3.0编程替代品,与过滤器的
功能相同。但是,您仍然需要在域中保留
条目和用户/密码/角色。如何在部署描述符中设置登录配置才能正常工作?如果删除表单身份验证,web浏览器会将request.userPrincipal设置为缓存值,因此(httpreq.getUserPrincipal()==null)将为false。如果我确实打开了表单身份验证,则过滤器根本不会运行,因为容器接管了它。@Ramsus:应该删除它。答案还表示“用此筛选器替换登录配置”。对于具有缓存值的浏览器设置,您可能需要关闭受保护页面的浏览器缓存(这可以在相同的筛选器中完成)。如果您使用的是GlassFish 3服务器,则需要删除添加到域的默认web.xml文件中的登录配置元素。有关更多信息,请参阅。