对于基于容器管理的表单的身份验证,登录页面位于由a打开的掩盖下,RequestDispatcher#forward()
因此原始请求URI可作为请求属性使用,其名称由标识RequestDispatcher#FORWARD_REQUEST_URI
。请求属性(基本上是请求范围)在JSF中,由提供ExternalContext#getRequestMap()
。
因此,这应该做到:
private String requestedURI;
@postconstruct
public void init() {
requestedURI = FacesContext.getCurrentInstance().getExternalContext()
.getRequestMap().get(RequestDispatcher.FORWARD_REQUEST_URI);
if (requestedURI == null) {
requestedURI = "some/default/home.xhtml";
}
}
public void submit() throws IOException {
// ...
try {
request.login(username, password);
externalContext.redirect(requestedURI);
} catch (ServletException e) {
context.addMessage(null,
new FacesMessage(FacesMessage.SEVERITY_ERROR,
"Bad login", null));
}
}
你只需要做出豆@ViewScoped
(JSF)或@ConversationScoped
代替(CDI)@SessionScoped
(绝对不是@RequestScoped
;与其一起使用,否则不同的方法的需求<f:param>
和<f:viewParam>
)。