本文收录于 《全栈 Bug 调优实战版》 专栏。专栏聚焦真实项目中的各类疑难 Bug从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者还是负责复杂项目的资深工程师都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论助你稳步进阶、放大技术价值 。特别说明文中问题案例来源于真实生产环境与公开技术社区并结合多位一线资深工程师与架构师的长期实践经验经过人工筛选与AI系统化智能整理后输出。文中的解决方案并非唯一“标准答案”而是兼顾可行性、可复现性与思路启发性的实践参考供你在实际项目中灵活运用与演进。欢迎订阅本专栏一次订阅后专栏内所有文章可永久免费阅读后续更新内容皆不用再次订阅持续更新中。 问题描述详细问题描述如下spring security我不管是重新创建项目还是用动力节点或者黑马的资料最开始那个登录我都不能跳转到上一个地址都是掉转到那个默认错误页面这怎么解决啊我什么配置都没有改只是加了一个UserController加了个/hello 返回 hellospring security别的都是默认的就是没办法跳转我看cookie里面也有那个Jsessionid了我再访问是能输出的全文目录 问题描述 请知悉如下方案不保证一定适配你的问题✅️问题理解✅️问题解决方案方案 A先把 /hello 写成“确定不会走视图解析”的 Rest 接口最高概率一招见效✅方案 B显式配置“登录成功后优先跳回原地址”并打印 SavedRequest 目标定位跳转到底跳去哪✅方案 C检查是否设置了 server.servlet.context-path路径前缀导致跳转地址不对✅方案 D你访问“原地址”可能是 POST/接口请求导致 SavedRequest 不适合跳转前后端分离最常见方案 E排除 /error 被保护导致循环/异常看似“默认错误页”但实际是安全链问题✅️问题延伸1为什么“JSESSIONID 有了、再访问能输出”但“登录那一下跳转失败”2你可以用一个极快的定位手段强烈建议✅️问题预测✅️小结 结语 互动说明 文末福利技术成长加速包 Who am I? 请知悉如下方案不保证一定适配你的问题如下是针对上述问题进行专业角度剖析答疑不喜勿喷仅供参考✅️问题理解你描述的现象非常典型访问受保护地址 → 被 Spring Security 拦截 → 跳到登录页登录成功后本该跳回原地址SavedRequest但你这里总是跳到默认错误页Whitelabel Error Page / 默认 error 页面你没改配置只新增了一个UserController提供/hello返回helloCookie 里有JSESSIONID登录后再访问/hello又能正常输出说明认证本身是成功的 这强烈暗示登录成功后的“跳转目标地址”本身是错的或不可用导致 Spring Security redirect 时 404/500最终落到默认 error 页。而“再访问能输出”说明会话里已经是登录态只是“成功跳转那一步”失败。这种情况最常见的根因有 6 类从高到低排序项目有 context-path / 路径前缀SavedRequest 保存了带前缀的地址但你 controller 实际路径不匹配或反之你访问的原地址并不是 GET 页面而是 POST/接口SavedRequest 恢复后重定向到一个不该跳的 endpoint比如/error、/login?error、或一个不支持 GET 的接口你用的是前后端分离/接口调用浏览器 XHR 触发 302 → 重定向链导致跳转到 error尤其是跨域、fetch、axios 默认不跟随 cookie/重定向/hello返回的是纯字符串但你访问方式是走 MVC 视图误用Controller没加ResponseBody导致返回被当成视图名去找模板hello.html找不到 → error成功处理器/默认跳转配置不对比如配置了defaultSuccessUrl(/error)或alwaysUseDefaultTargetUrltrueCSRF / 会话策略/RequestCache 不生效比如 session 创建策略、SavedRequest 被清掉你说“我只是加了 UserController /hello 返回 hello”这里第 4 条的概率非常高如果你用的是Controller并且方法返回helloSpring MVC 会把它当成视图名默认会去找hello.html/jsp找不到就 Whitelabel Error Page。但你说“再访问能输出”这又像你访问/hello的时候其实是能返回字符串的——所以需要看你到底用的是RestController还是Controller。✅️问题解决方案方案 A先把/hello写成“确定不会走视图解析”的 Rest 接口最高概率一招见效✅你把 Controller 改成下面这样强烈建议直接照抄RestControllerpublicclassUserController{GetMapping(/hello)publicStringhello(){returnhello;}}如果你必须用Controller那就必须加ResponseBodyControllerpublicclassUserController{ResponseBodyGetMapping(/hello)publicStringhello(){returnhello;}}✅ 这样可以彻底排除“hello 被当成视图名 → 找不到模板 → 进入 /error”的情况。很多“登录后跳默认错误页”的根因就是这个登录后跳回 /hello但 /hello 其实返回的是视图名 hello。你可以用浏览器直接访问/hello看响应如果返回了 Whitelabel Error Page基本就是这个问题如果响应 body 是hello那再看下面方案 B/C方案 B显式配置“登录成功后优先跳回原地址”并打印 SavedRequest 目标定位跳转到底跳去哪✅即便你没改配置有时教程版本差异Security 5/6 默认行为也会让你困惑。建议你显式加一个成功处理器把要跳转的 URL 打出来。Spring Security 6Boot 3写法推荐BeanSecurityFilterChainsecurityFilterChain(HttpSecurityhttp)throwsException{http.authorizeHttpRequests(auth-auth.requestMatchers(/login,/error).permitAll().anyRequest().authenticated()).formLogin(form-form.successHandler((request,response,authentication)-{varcachenewHttpSessionRequestCache();varsavedcache.getRequest(request,response);Stringtarget(saved!null)?saved.getRedirectUrl():/hello;System.out.println( login success, redirect to: target);response.sendRedirect(target);}));returnhttp.build();}✅ 这样你就能确定登录成功时 Spring Security 想跳到哪里。如果打印出来的是/error或一个不存在的地址那就是 SavedRequest 的来源有问题看方案 C/D。如果打印出来的是/hello但仍 error那还是回到方案 A视图解析/映射问题。方案 C检查是否设置了server.servlet.context-path路径前缀导致跳转地址不对✅很多课程或你电脑的某个默认配置可能让你项目带了前缀比如server.servlet.context-path/api如果你带了 context-path实际访问http://localhost:8080/api/hello但 SavedRequest/重定向可能变成/hello或/api/hello不一致最终跳转 404 → error✅ 解决去application.properties/yml搜server.servlet.context-path有就先注释掉试试或者保证你访问路径、登录页、controller 路径一致方案 D你访问“原地址”可能是 POST/接口请求导致 SavedRequest 不适合跳转前后端分离最常见如果你是通过 ajax/fetch 调接口触发 302Spring Security 保存的原请求可能是一个 POST API或者一个需要特殊 header 的接口登录成功后重定向去它 → 浏览器 GET 一下 → 405/415/500 → error✅ 解决策略两种D1对 API 走 401 JSON不走重定向前后端分离推荐API 端用httpBasic或自定义 entryPoint 返回 401Web 端才用 formLoginD2强制登录成功跳固定页面不依赖 SavedRequest.formLogin(form-form.defaultSuccessUrl(/hello,true)// true 表示总是去这里)适合你就是想先跑通“登录后有个成功页”不纠结回跳。方案 E排除/error被保护导致循环/异常看似“默认错误页”但实际是安全链问题有时/error被 security 保护导致异常处理时又触发登录再触发错误……表现非常怪。建议明确放行.authorizeHttpRequests(auth-auth.requestMatchers(/error,/login,/css/**,/js/**).permitAll().anyRequest().authenticated())✅️问题延伸1为什么“JSESSIONID 有了、再访问能输出”但“登录那一下跳转失败”流程其实是这样的未登录访问/hello→ 302 去/login并把原请求存到 sessionSavedRequest提交登录成功 → Spring Security 从 session 拿 SavedRequest →sendRedirect(原地址)如果原地址处理出错404/500/视图找不到/方法不匹配→ 落到/error→ 你看到默认错误页但此时 session 已经是认证态所以你再访问/hello又能正常看到内容✅ 所以关键不是“登录是否成功”而是“成功后重定向目标是否能正确处理”。2你可以用一个极快的定位手段强烈建议把你登录成功后打印的跳转地址抓出来方案 B或者直接看 NetworkDevTools → Network登录提交请求一般是/login看响应是否 302302 的Location是什么如果是/error或不存在路径 → SavedRequest/配置问题如果是/hello但 404/500 → Controller 映射/视图解析问题✅️问题预测如果你继续按课程资料走未来你还会经常遇到这些“跳转怪问题”Security 6 (Boot 3) 与旧教程 (Security 5/Boot 2) 写法差异旧的WebSecurityConfigurerAdapter已废弃很多教程代码复制后表现会不一致。Controller vs RestController 混用返回字符串到底是“响应体”还是“视图名”这类坑非常高频。前后端分离时 formLogin 重定向不适合 API会引发“登录页 HTML 被当 JSON 处理”等连锁问题。✅️小结你这个问题本质上是登录成功后的重定向目标地址处理失败所以掉进默认 error 页面但认证态已建立所以你再访问能输出。最高概率的修复是先确保/hello用RestController或ResponseBody避免被当视图名再用 successHandler 打印 SavedRequest 的 redirectUrl确认到底跳到哪检查 context-path、/error 是否放行、是否访问的是 API POST 导致回跳不合理 结语 互动说明希望以上分析与解决思路能为你当前的问题提供一些有效线索或直接可用的操作路径。若你按文中步骤执行后仍未解决不必焦虑或抱怨这很常见——复杂问题往往由多重因素叠加引起欢迎你将最新报错信息、关键代码片段、环境说明等补充到评论区我会在力所能及的范围内结合大家的反馈一起帮你继续定位 如果你有更优或更通用的解法非常欢迎在评论区分享你的实践经验或改进方案你的这份补充可能正好帮到更多正在被类似问题困扰的同学正所谓「赠人玫瑰手有余香」也算是为技术社区持续注入正向循环 文末福利技术成长加速包 文中部分问题来自本人项目实践部分来自读者反馈与公开社区案例也有少量经由全网社区与智能问答平台整理而来。若你尝试后仍没完全解决问题还请多一点理解、少一点苛责——技术问题本就复杂多变没有任何人能给出对所有场景都 100% 套用的方案。如果你已经找到更适合自己项目现场的做法非常建议你沉淀成文档或教程这不仅是对他人的帮助更是对自己认知的再升级。如果你还在持续查 Bug、找方案可以顺便逛逛我专门整理的 Bug 专栏《全栈 Bug 调优实战版》️这里收录的都是在真实场景中踩过的坑希望能帮你少走弯路节省更多宝贵时间。✍️如果这篇文章对你有一点点帮助欢迎给 bug菌 来个一键三连关注 点赞 收藏你的支持是我持续输出高质量实战内容的最大动力。同时也欢迎关注我的硬核公众号 「猿圈奇妙屋」获取第一时间更新的技术干货、BAT 等互联网公司最新面试真题、4000G 技术 PDF 电子书、简历 / PPT 模板、技术文章 Markdown 模板等资料通通免费领取。你能想到的绝大部分学习资料我都尽量帮你准备齐全剩下的只需要你愿意迈出那一步来拿。 Who am I?我是 bug菌热活跃于 CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等技术社区CSDN 博客之星 Top30、华为云多年度十佳博主/卓越贡献者、掘金多年度人气作者 Top40掘金、InfoQ、51CTO 等平台签约及优质作者全网粉丝累计30w。更多高质量技术内容及成长资料可查看这个合集入口 点击查看 ️硬核技术公众号「猿圈奇妙屋」期待你的加入一起进阶、一起打怪升级。- End -