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

文章目录

  • 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: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 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>

你可能感兴趣的:(#,JavaWeb,spring-security)