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
Java 在JSF Web应用程序中如何记住要重定向到的原始url_Java_Jsf - Fatal编程技术网

Java 在JSF Web应用程序中如何记住要重定向到的原始url

Java 在JSF Web应用程序中如何记住要重定向到的原始url,java,jsf,Java,Jsf,我有一个JSF web应用程序,需要提供如下所述的功能: 为了对某些内容发表评论,用户必须登录 如果他未登录,则“单击此处登录”会将他带到登录页面 成功登录必须将他重定向到他导航到登录页面的url 有什么方法可以实现这一点吗?根据问题,您显然没有在web.xml中使用域和的容器管理身份验证。它将为您完全透明地处理此问题 我假设您已经自行开发了一个,当会话中没有登录用户时,它会将用户重定向到登录页面。在这种情况下,还需要将当前请求URL添加为请求参数或会话属性 下面是一个将其作为请求参数传递到筛

我有一个JSF web应用程序,需要提供如下所述的功能:

  • 为了对某些内容发表评论,用户必须登录
  • 如果他未登录,则“单击此处登录”会将他带到登录页面
  • 成功登录必须将他重定向到他导航到登录页面的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中定义一个领域,具体如何定义取决于所使用的容器,但通常都有很好的文档记录。您可以在此处找到包含基本示例和文档链接的答案: