ssm整合spring-security遇到的404错误、一直重定向于登入界面的错误

2022-08-12 07:56:26

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>
  • 作者:别闹'
  • 原文链接:https://blog.csdn.net/qq_43546676/article/details/105332195
    更新时间:2022-08-12 07:56:26