文章目錄
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>