我有一个JSF Web应用程序,我需要提供如下所述的功能:
有什么办法可以实现吗?
答案 0 :(得分:3)
根据问题,您显然没有使用领域的容器管理身份验证和<security-constraint>
中的web.xml
。它将为您完全透明地处理这个问题。
我假设您已经自己开发了filter,当会话中没有登录用户时,会将用户重定向到登录页面。在这种情况下,您还需要将当前请求URL添加为请求参数或会话属性。
这是一个将其作为过滤器中的请求参数传递的示例:
if (user == null) {
String from = URLEncoder.encode(request.getRequestURI(), "UTF-8");
if (request.getQueryString() != null) from += "?" + request.getQueryString();
response.sendRedirect("login.jsf?from=" + from);
}
将其作为隐藏字段嵌入登录表单中(是的,使用纯HTML / JSTL,JSF 1.x在这里没用):
<input type="hidden" name="from" value="${fn:escapeXml(param.from)}" />
在登录方法中,检查它是否存在并相应处理:
public String login() {
// ...
String from = externalContext.getRequestParameterMap().get("from");
if (from != null && !from.isEmpty()) {
externalContext.redirect(from);
return null;
} else {
return "home"; // Default landing page after login.
}
}
这是一个将其作为过滤器中的会话属性传递的示例:
if (user == null) {
String from = request.getRequestURI();
if (request.getQueryString() != null) from += "?" + request.getQueryString();
request.getSession().setAttribute("from", from);
response.sendRedirect("login.jsf");
}
这不需要隐藏字段。在登录方法中,检查它是否存在并相应处理:
public String login() {
// ...
String from = externalContext.getSessionMap().get("from");
if (from != null && !from.isEmpty()) {
externalContext.getSessionMap().remove("from");
externalContext.redirect(from);
return null;
} else {
return "home"; // Default landing page after login.
}
}
答案 1 :(得分:0)
JSF和URL不能很好地协同工作:JSF URL不可收藏,与您正在查看的页面相比,URL总是晚一页......所以在您的情况下,您不应该考虑URL但在视图(.xhtml)文件方面。
解决问题的一种方法是创建一个会话管理bean,它在您执行第2步时存储当前视图(以及相关的bean参数)。一旦用户登录,检查此会话bean是否存在,以及如果是这样,将用户重定向到存储的视图,而不是将他重定向到标准的登录后视图。这是通过在doSignIn方法中返回“viewName”来完成的。