Java 在JSF Web应用程序中如何记住要重定向到的原始url
我有一个JSF web应用程序,需要提供如下所述的功能:Java 在JSF Web应用程序中如何记住要重定向到的原始url,java,jsf,Java,Jsf,我有一个JSF web应用程序,需要提供如下所述的功能: 为了对某些内容发表评论,用户必须登录 如果他未登录,则“单击此处登录”会将他带到登录页面 成功登录必须将他重定向到他导航到登录页面的url 有什么方法可以实现这一点吗?根据问题,您显然没有在web.xml中使用域和的容器管理身份验证。它将为您完全透明地处理此问题 我假设您已经自行开发了一个,当会话中没有登录用户时,它会将用户重定向到登录页面。在这种情况下,还需要将当前请求URL添加为请求参数或会话属性 下面是一个将其作为请求参数传递到筛
有什么方法可以实现这一点吗?根据问题,您显然没有在
web.xml
中使用域和
的容器管理身份验证。它将为您完全透明地处理此问题
我假设您已经自行开发了一个,当会话中没有登录用户时,它会将用户重定向到登录页面。在这种情况下,还需要将当前请求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);
}
if (user == null) {
String from = request.getRequestURI();
if (request.getQueryString() != null) from += "?" + request.getQueryString();
request.getSession().setAttribute("from", from);
response.sendRedirect("login.jsf");
}
将其作为隐藏字段嵌入登录表单中(是的,使用纯HTML/JSTL,JSF 1.x在这里没有帮助):
在登录方法中,检查是否存在,并进行相应处理:
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.
}
}
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.
}
}
以下示例将其作为筛选器中的会话属性传递:
if (user == null) {
String from = URLEncoder.encode(request.getRequestURI(), "UTF-8");
if (request.getQueryString() != null) from += "?" + request.getQueryString();
response.sendRedirect("login.jsf?from=" + from);
}
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.getRequestParameterMap().get("from");
if (from != null && !from.isEmpty()) {
externalContext.redirect(from);
return null;
} else {
return "home"; // Default landing page after login.
}
}
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.
}
}
JSF和URL不能很好地协同工作:JSF URL不可添加书签,URL总是比您正在查看的页面晚一页,等等。。。因此,在您的情况下,您不应该考虑URL,而应该考虑视图(.xhtml)文件
解决问题的一种方法是在步骤2创建一个会话管理bean,该bean存储当前视图(以及相关联的bean参数,如果有的话)。用户登录后,检查此会话bean是否存在,如果存在,则将用户重定向到存储视图,而不是将其重定向到标准登录后视图。这是通过在doSignIn方法中返回“viewName”来完成的。Waw,谢谢您!我们如何通过安全约束来实现这一点呢?不过,这需要对登录和筛选用户的方式进行一些更改。您必须在servletcontainer中定义一个领域,具体如何定义取决于所使用的容器,但通常都有很好的文档记录。您可以在此处找到包含基本示例和文档链接的答案: