【问题标题】:JSF Spring security log out buttonJSF Spring 安全注销按钮
【发布时间】:2022-02-24 23:46:34
【问题描述】:

如何将以下内容从链接转换为按钮?

<h:outputLink value="#{request.contextPath}/j_spring_security_logout">Logout</h:outputLink>

如果我尝试添加导航规则,它会找不到 j_spring_security_logout...

【问题讨论】:

    标签: jsf spring-security


    【解决方案1】:

    要么使用 CSS 来设置链接的样式,使其看起来像一个按钮。

    <h:outputLink styleClass="button">
    

    类似的东西

    a.button {
        display: inline-block;
        background: lightgray;
        border: 2px outset lightgray;
        cursor: default;
    }
    a.button:active {
        border-style: inset;
    }
    

    或引入一个普通的 HTML 表单:

    <form action="#{request.contextPath}/j_spring_security_logout">
        <input type="submit" value="Logout">
    </form>
    

    【讨论】:

      【解决方案2】:

      另一种解决方案是:

      <p:button value="Logout with spring" outcome="logout"></p:button>
      

      别忘了设置它。
      faces-config.xml

        <navigation-rule>
          <from-view-id>/your/path/index.xhtml</from-view-id>
            <navigation-case>
                <from-outcome>logout</from-outcome>
                <to-view-id>/j_spring_security_logout?faces-redirect=true</to-view-id>
            </navigation-case>
       </navigation-rule>
      

      如果您忘记添加“?faces-redirect=true”,则会收到错误消息。因为您被重定向到“http://localhost/projectNmae/j_spring_security_logout.xhtml”。所以您应该使用它

      如果你想使用“p:commandButton” ,您必须使用 managedBean 返回结果。
      ( return "logout"; )

      【讨论】:

        【解决方案3】:

        对于与我相同情况的任何未来读者,如果您正在使用:

        • spring-security 版本 >=4
        • jsf + primefaces

        您想使用&lt;p:commandButton&gt; 而不是普通的&lt;input&gt; 来利用primeface 的styleClass 进行按钮样式:

        要触发spring-security的默认注销端点/logout,您可以在commandButtononcomplete属性中执行以下自定义jquery命令:

        // One line version
        oncomplete="$.ajax('/logout').then(() => {let dest = window.location.origin + '/login.xhtml'; window.location.href = dest; });"
        
        // Explanation
        // Send request to spring security's logout end point
        $.ajax("/logout").then(
            () => {
                // Your login page destination
                let dest = window.location.origin + "/login.xhtml";
                // Refresh the browser using the login destination
                window.location.href = dest;
            }
        );
        

        注销按钮将同时工作并看起来很棒:)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-08-23
          • 2015-06-14
          • 2014-09-17
          • 2015-10-05
          • 2014-05-01
          • 2023-04-05
          • 2011-08-05
          • 2011-10-19
          相关资源
          最近更新 更多