You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Security中URL带?error时显示错误页及C:if失效排查

Spring Security登录错误提示不显示问题排查与解决

问题核心

你遇到的问题是登录失败后,JSP页面中的<c:if test="${param.error != null}">无法触发,错误提示不显示;同时对登录请求方法存在误解——登录提交是POST,但失败后的跳转是GET,这是正常流程,无需修改为POST,关键是要让Spring Security正确传递error参数到登录页面。

原因分析

  1. 缺失Spring Security核心配置:你未提供Security配置类,这是控制登录流程、失败跳转逻辑的关键。默认情况下Spring Security登录失败后会重定向到登录页面并携带error参数,但配置缺失或错误会导致参数无法传递。
  2. JSTL依赖重复:pom.xml中重复添加了JSTL依赖,可能引发冲突导致标签不生效。
  3. 手动测试逻辑偏差:直接访问带?error的URL不生效,可能是JSTL标签未正确解析或配置问题。

解决方案

1. 补全Spring Security配置类

创建Security配置类,明确登录页面、处理URL和失败跳转规则:

package com.mandeep.website.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                // 允许所有人访问首页和登录页
                .antMatchers("/", "/showMyLoginPage").permitAll()
                // 其他请求需认证
                .anyRequest().authenticated()
                .and()
            // 配置表单登录
            .formLogin()
                // 指定登录页面URL
                .loginPage("/showMyLoginPage")
                // 与JSP中form的action保持一致
                .loginProcessingUrl("/Map/authenticateUser")
                // 登录成功默认跳转首页
                .defaultSuccessUrl("/")
                // 失败后重定向回登录页并自动携带error参数
                .failureUrl("/showMyLoginPage?error")
                .permitAll()
                .and()
            .logout()
                .permitAll();
    }
}

关键说明:

  • loginProcessingUrl必须和JSP表单的action完全匹配,确保Spring Security能拦截登录请求。
  • failureUrl明确指定失败跳转地址,Spring Security会自动附加?error参数,让JSP的<c:if>能正确读取。

2. 修复JSTL依赖重复问题

删除pom.xml中重复的JSTL依赖,保留一个即可:

<!-- 移除重复的依赖 -->
<!--
<dependency>
    <groupId>jstl</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>
-->

3. 验证JSP标签与配置

  • 确保JSP页面的JSTL标签引入正确:<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>。
  • 检查Spring MVC配置类是否开启注解驱动(@EnableWebMvc),确保组件扫描覆盖到控制器和配置类:
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.mandeep.website")
public class MvcConfig implements WebMvcConfigurer {
    // 可添加视图解析器等配置
}

4. 测试流程

  1. 访问登录页面,输入错误用户名/密码提交(POST请求到/Map/authenticateUser)。
  2. Spring Security验证失败后,会重定向到/showMyLoginPage?error(GET请求),此时错误提示应正常显示。
  3. 也可手动访问/showMyLoginPage?error,测试JSTL标签是否生效,若仍不显示,需检查web容器(如Tomcat)是否支持JSTL,或web.xml中是否正确配置DispatcherServlet。

内容的提问来源于stack exchange,提问作者Mandeep

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 18:00:40