文章目录
- 1. 404错误
- 1.1 第一种可能
- 1.2 第二种可能
- 2. 页面上显示错误“重定向请求过多”
- 3. 无论登入成功还是失败一直重定向在登入界面
- 3.1 第一个可能
- 3.2 第二个可能
- 3. 最后附上我的spring-security的配置文件
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>