我一直在试验这个问题的实质(JSF / Java EE login without requiring a protected resource)。
如果我使用BASIC身份验证设置一个示例应用程序,一个公共页面(/public.xhtml)和一个受保护页面(/protected/private.xhtml),我有一个从第一页到第二页的链接(如下图所示),一切都很完美。
<h:commandButton value="Go Private" action="/protected/private?faces-redirect=true" />
但是,如果我删除login-config
并将以上按钮替换为:
<h:commandButton value="Go Private" action="#{mybean.login}" />
...和#{mybean.login}看起来像这样...
public String login() {
HttpServletRequest request = ...
try {
request.login("known username", "known password");
} catch (Exception e) {
// handle unknown credentials
}
return "/protected/private?faces-redirect=true";
}
在这种情况下,登录成功(request.login()
无例外),但浏览器显示“禁止资源”页面。
任何人都可以了解两种情景之间的区别吗?
答案 0 :(得分:0)
HttpServletRequest#login()
程序化登录仅适用于基于FORM
的身份验证配置。删除<login-config>
会使其默认为BASIC
,因此login()
将无法正常工作。 login()
基本上在会话中设置用户,但BASIC
身份验证基本上检查Authenticate
HTTP请求标头,而不是会话。
如果您想使用<login-config>
,请将FORM
放回login()
。
答案 1 :(得分:-1)
它在哪里:
<h:commandButton value="Go Private" action="#{mybean.login}" />
它应该是:
<h:commandButton value="Go Private" action="#{mybean.login()}" />
如果您想使用登录方法。
但也许你的mybean也有
String private login;
public String getLogin(){ return this.login ;}
并且您已经使用所需的响应加载了var。