ssm整合spring-security遇到的404錯誤、一直重定向於登入界面的錯誤

1. 404錯誤

1.1 第一種可能

如果你設置的登入頁面是.html頁面,則會出現404的問題。因爲spring-security要操作頁面,都是請求springmvc得到的。spring-security要跳轉到login-page="/login.html",會給springmvc發送/login.html的請求,而html是靜態資源,默認springmvc不允許訪問靜態資源。如果你不在spring-mvc.xml配置文件中設置允許該靜態資源允許被訪問,則會找不到資源。

所以,在spring-mvc.xml配置文件中編寫一下代碼:

<mvc:resources location="/login.html" mapping="/login.html"/>

然後就可以訪問資源了。不過個人建議用jsp比較好。

1.2 第二種可能

沒有在spring-security.xml中設置csrf:<security:csrf disabled="true"/>,其位置如下:

<security:http auto-config="true" use-expressions="false">
        <!-- 配置資料連接,表示任意路徑都需要ROLE_USER權限 -->
        <security:intercept-url pattern="/**" access="ROLE_USER"/>
        <security:form-login
                login-page="/pages/login.jsp"
                login-processing-url="/login"
                username-parameter="username"
                password-parameter="password"
                authentication-failure-url="/pages/failure.jsp"
                default-target-url="/pages/success.jsp"
                always-use-default-target="true"
                />
        <security:logout invalidate-session="true" logout-url="/logout"
                         logout-success-url="/login.jsp"/>

        <!-- 關閉CSRF,默認是開啓的 -->
        <security:csrf disabled="true"/>
    </security:http>

2. 頁面上顯示錯誤“重定向請求過多”

你用spring-security攔截了所有的請求,但是,請求登入界面的請求不應該被攔截,不然就陷入了死循環,一直重定向,造成此錯誤。
應該設置:<security:http security="none" pattern="/pages/login.jsp"/>,表示不過濾某些請求,其位置如下:

<!-- 配置不過濾的資源(靜態資源及登錄相關) -->
<security:http security="none" pattern="/pages/login.jsp"/>

<security:http auto-config="true" use-expressions="false">
    <!-- 配置資料連接,表示任意路徑都需要ROLE_USER權限 -->
    <security:intercept-url pattern="/**" access="ROLE_USER"/>
    <security:form-login
            login-page="/pages/login.jsp"
            login-processing-url="/login"
            username-parameter="username"
            password-parameter="password"
            authentication-failure-url="/pages/failure.jsp"
            default-target-url="/pages/success.jsp"
            always-use-default-target="true"
            />
    <security:logout invalidate-session="true" logout-url="/logout"
                     logout-success-url="/login.jsp"/>

    <!-- 關閉CSRF,默認是開啓的 -->
    <security:csrf disabled="true"/>
</security:http>

3. 無論登入成功還是失敗一直重定向在登入界面

3.1 第一個可能

出現這個原因,你應該和我一樣用的是jsp文件,我都網上翻了各種資料,找了好幾個小時,沒找到。第二天自己無意間把錯誤找到了:

在登入的login.jsp頁面中,登入的請求必須要絕對請求路徑,不能用相對請求路徑:

必須這樣:
<form action="${pageContext.request.contextPath}/login" method="post">

不能這樣:
<form action="login" method="post">

3.2 第二個可能

登陸界面的請求與login-processing-url請求的名字不一樣:

<form action="${pageContext.request.contextPath}/login" method="post">

login-processing-url="/login"

這裏 action="${pageContext.request.contextPath}/XXX" 和 login-processing-url="/XXX"
這裏的XXX必須一致

這樣基本上沒有問題了。

3. 最後附上我的spring-security的配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:security="http://www.springframework.org/schema/security"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/security
       http://www.springframework.org/schema/security/spring-security.xsd">

    <!-- 配置不過濾的資源(靜態資源及登錄相關) -->
    <security:http security="none" pattern="/pages/login.jsp"/>
    <security:http security="none" pattern="/pages/failure.jsp"/>

    <security:http auto-config="true" use-expressions="false">
        <!-- 配置資料連接,表示任意路徑都需要ROLE_USER權限 -->
        <security:intercept-url pattern="/**" access="ROLE_USER"/>

        <!-- 自定義登陸頁面
            login-page 登陸頁面
            login-processing-url : 發送登陸請求數據的url
            authentication-failure-url 用戶權限校驗失敗後後纔會跳轉到這個頁面,
            default-target-url 登陸成功後跳轉的頁面。
            always-use-default-target: true 適用於後臺管理系統,防止訪問歷史記錄
                                       false 適用於前臺頁面,提升用戶體驗
        -->
        <security:form-login
                login-page="/pages/login.jsp"
                login-processing-url="/login"
                username-parameter="username"
                password-parameter="password"
                authentication-failure-url="/pages/failure.jsp"
                default-target-url="/pages/success.jsp"
                always-use-default-target="true"
                />

        <!-- 登出:
            invalidate-session 是否刪除session
            logout-url:登出處理鏈接
            logout-successurl:登出成功頁面
            注:登出操作 只需要鏈接到 logout即可登出當前用戶
        -->
        <security:logout invalidate-session="true" logout-url="/logout"
                         logout-success-url="/login.jsp"/>

        <!-- 關閉CSRF,默認是開啓的 -->
        <security:csrf disabled="true"/>
    </security:http>

    <!-- 在內存中構造用戶們 -->
    <security:authentication-manager>
        <security:authentication-provider>
            <security:user-service>
                <security:user name="user" password="{noop}user" authorities="ROLE_USER"/>
                <security:user name="admin" password="{noop}admin" authorities="ROLE_ADMIN"/>
            </security:user-service>
        </security:authentication-provider>
    </security:authentication-manager>
</beans>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章