使用SpringSecurity下,發生重定向異常

使用SpringSecurity下,發生空轉異常

image-20250408171305656

環境信息:

Spring Boot 3.4.4 , jdk 17 , springSecurity 6.4.4

問題背景:

沒有自定義controller ,改寫了login 頁面,并且進行了成功后的跳轉處理,發現無法進入到login.html 頁面,并且報錯。但是如果不進行改寫,login 則會自動被跳轉到默認登陸頁面,完成正常攔截。http://localhost:9999/bootscoder/login 比起我的改寫后的少了一個 后綴

問題復現:

核心代碼:

配置文件:

// 自定義表單登錄配置http.formLogin(form -> {form.loginPage("/login.html")  // 自定義登錄頁面.usernameParameter("username").passwordParameter("password").loginProcessingUrl("/login")//登錄路徑,表單向該路徑提交,提交后自動執行UserDetailsService的方法.successForwardUrl("/main.html") // 使用重定向實現登錄成功后的跳轉
//                    .successHandler(new MyLoginSuccessHandler()) // 登錄成功處理器.failureForwardUrl("/fail.html");});// 設置放行的資源http.authorizeHttpRequests(authz -> {// 放行登錄頁、處理路徑、失敗頁和靜態資源authz.requestMatchers("/login.html", "/fail.html", "/main.html").permitAll();authz.requestMatchers("/css/*.css", "/js/*.js", "/img/**").permitAll();// 其余請求要求認證authz.anyRequest().authenticated();});// 關閉csrf防護(僅供測試使用,生產環境需謹慎關閉)
//        http.csrf(csrf -> csrf.disable());

登陸頁面:

<div class="container"><h1>用戶登錄</h1><form action="/bootscoder/login" method="post"><input type="hidden"  th:value = "${_csrf.token}" name="_csrf" th:if="${_csrf}"><div class="form-group"><label for="username">用戶名</label><input type="text" id="username" name="username" placeholder="請輸入用戶名" value="bootscoder" required></div><div class="form-group"><label for="password">密碼</label><input type="password" id="password" name="password" placeholder="請輸入密碼" value="root" required></div><input type="checkbox" name="remember-me" value="true"/>記住我</br><button type="submit">登錄</button></form>
</div>

yml前綴配置:

server:port: 9999servlet:context-path: /bootscoder  # 所有接口前綴為 /bootscoder

錯誤信息:

This page isn’t working

localhost redirected you too many times.

Try deleting your cookies

ERR_TOO_MANY_REDIRECTS

分析原因

我的資源放到的是templates中, 也就是說 security 默認的登陸頁面在static中。
所以 當我 訪問templates下的路徑,由于沒有寫contoller 接口,會發生意外跳轉,被攔截后,跳轉到static 的默認登陸,然后由于我改寫了登陸page,所以又會跳回來,這樣導致了 重定向異常。

Spring Security 在配置登錄表單時,如果未能找到合適的頁面映射(比如你沒有正確配置自定義登錄頁面的訪問路徑),就可能會觸發默認的登錄頁面(默認在 static 目錄下)與自定義頁面之間的沖突,從而產生重定向循環。

解決方案

你的分析是正確的。如果你的登錄頁面放在了 templates 目錄下,而沒有額外通過 Controller 將其渲染,那么 Spring Boot 默認配置下實際上并不會訪問該模板,而是走了靜態資源(static 目錄)中的默認登錄頁面,從而產生了重定向循環。

下面有兩種解決方案:


方案一:將登錄頁面移動到 static 目錄

如果你不需要使用模板引擎渲染(例如 Thymeleaf 動態處理數據),可以直接把 login.html 文件放到 src/main/resources/static 目錄下,這樣資源可以直接被以靜態資源的形式訪問而不會依賴 Controller。

注意:這種方式下,你在 HTML 中寫死的路徑也需要注意避免重復拼接 context path。例如:

<form th:action="@{/login}" method="post">

<form action="/login" method="post">

(注意不要寫成 /bootscoder/login,因為 Spring Boot 會自動處理 context path)


注意??:

不能使用MVC模板引擎:靜態資源文件夾中的HTML頁面不會被模板引擎(如Thymeleaf)處理,所以不能使用th:action等Thymeleaf標簽。

頁面跳轉方式變化

  • 在模板引擎處理的頁面中,可以通過控制器方法返回視圖名稱來實現頁面跳轉
  • 在靜態頁面中,需要使用JavaScript進行頁面重定向(window.location.href)或通過AJAX請求與后端交互

表單提交方式

  • 靜態頁面中的表單提交需要通過JavaScript攔截提交事件,使用fetchXMLHttpRequest等API發送請求到后端
  • 不能依賴Spring MVC的表單處理機制直接提交到控制器方法

方案二:為模板頁面添加 Controller(推薦)

如果你需要利用模板引擎(如 Thymeleaf)進行頁面渲染,則需要提供一個 Controller 映射 GET 請求去返回該模板。例如,你可以這樣做:

package com.example.demo.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;@Controller
public class LoginController {@GetMapping("/login.html")public String login() {// 返回 templates/login.html 渲染結果return "login";  // 注意:返回值 "login" 對應 src/main/resources/templates/login.html}
}
安全配置修改

同時,確保你的 Spring Security 配置中放行登錄頁面、登錄處理 URL 以及失敗頁面,如下所示:

http.formLogin(form -> {form.loginPage("/login.html")  // 自定義登錄頁面,由 Controller 渲染.usernameParameter("username").passwordParameter("password").loginProcessingUrl("/login") // 處理登錄請求,實際為 /bootscoder/login.defaultSuccessUrl("/main.html", true).failureUrl("/fail.html");
});http.authorizeHttpRequests(authz -> {// 放行登錄頁、登錄處理 URL、失敗頁和靜態資源authz.requestMatchers("/login.html", "/login", "/fail.html", "/main.html").permitAll();authz.requestMatchers("/css/*.css", "/js/*.js", "/img/**").permitAll();authz.anyRequest().authenticated();
});// 如果需要調試,可以先關閉 CSRF(僅用于測試環境)
// http.csrf(csrf -> csrf.disable());

同時,為靜態頁面(如 fail.htmlmain.html)也建議確認它們能被正確訪問,如果你沒有為它們提供 Controller 渲染,那就把這類頁面放入 static 目錄中。

小結

  • 放在 static 目錄:如果不依賴模板渲染,可以直接將 login.html 放至 static,避免因找不到自定義 Controller 而觸發 Security 默認登錄頁。
  • 使用 Controller 渲染模板:如果需要把頁面放在 templates 下利用 Thymeleaf 渲染,則必須提供映射該 GET 請求的 Controller,否則 Spring Security 可能依然會使用默認靜態的登錄頁面,造成重定向循環。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/75100.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/75100.shtml
英文地址,請注明出處:http://en.pswp.cn/web/75100.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

S130N-ISI 全棧方案與云平臺深度協同:重構 PLC 開發新范式

一、什么是 PLC&#xff1f; 1.技術定義 PLC&#xff08;Power Line Communication&#xff09;是一種創新的通信技術&#xff0c;它以電力線作為天然的傳輸介質&#xff0c;通過先進的信號調制技術將高頻數據信號疊加于工頻電流之上&#xff0c;實現電力輸送與數據通信的雙頻共…

SU-YOLO:基于脈沖神經網絡的高效水下目標檢測模型解析

論文地址:https://arxiv.org/pdf/2503.24389 目錄 一、論文概述 二、創新點解析 1. 基于脈沖的水下圖像去噪(SpikeDenoiser) 原理與結構 2. 分離批歸一化(SeBN) 原理與結構 3. 優化的殘差塊(SU-Block) 原理與結構 三、代碼復現指南 環境配置 模型訓練 四、…

實現阿里云服務器上的文字聊天程序以及C語言寫的進程間通信(IPC)程序

實現阿里云服務器上的文字聊天程序以及C語言寫的進程間通信&#xff08;IPC&#xff09;程序 1. 基于 Linux 中的管道進行進程間通信 我們首先使用管道進行進程間通信&#xff0c;這對于簡單的聊天程序來說是一個比較簡單且實用的方法。 步驟&#xff1a; 創建管道&#xf…

COMSOL 與人工智能融合的多物理場應用:28個案例的思路、方法與工具概述

應用案例概述 基于 COMSOL 與人工智能&#xff08;AI&#xff09;結合的應用案例涵蓋了 28 個多領域場景&#xff0c;包括工程&#xff08;如熱傳導優化、結構力學預測&#xff09;、能源&#xff08;如電池熱管理、燃料電池性能&#xff09;、生物醫學&#xff08;如藥物傳遞…

SAN及其ZONE

目錄 一、什么是SAN? 二、什么是ZONE? 三、配置ZONE 2.1 核心概念 2.2 劃分原則 2.3 Zone劃分最佳實踐 2.4 配置語法 1). 基于端口&#xff08;Domain,Port&#xff09;的zone語法 2). 基于WWN&#xff08;World Wide Name&#xff09;的Zone語法 3). 使用Alias簡化配置 4).…

Springboot框架—單元測試操作

Springboot單元測試的操作步驟&#xff1a; 1.添加依賴spring-boot-starter-test 在pom.xml中添加依賴spring-boot-starter-test 2.在src/test/java下新建java class 3.單元測試入口代碼結構 import org.junit.Test; import org.junit.runner.RunWith; import org.springfra…

用AbortController取消事件綁定

視頻教程 React - &#x1f914; Abort Controller 到底是什么神仙玩意&#xff1f;看完這個視頻你就明白了&#xff01;&#x1f4a1;_嗶哩嗶哩_bilibili AbortController的好處之一是事件綁定的函數已無需具名函數,匿名函數也可以被取消事件綁定了 //該代碼2秒后點擊失效…

JavaScript性能優化(上)

1. 減少 DOM 操作 減少 DOM 操作是優化 JavaScript 性能的重要方法&#xff0c;因為頻繁的 DOM 操作會導致瀏覽器重繪和重排&#xff0c;從而影響性能。以下是一些具體的策略和技術&#xff0c;可以幫助有效減少 DOM 操作&#xff1a; 1.1. 批量更新 DOM 親切與母體&#xff…

OpenCV 圖形API(14)用于執行矩陣(或圖像)與一個標量值的逐元素乘法操作函數mulC()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 描述 將矩陣與標量相乘。 mulC 函數將給定矩陣 src 的每個元素乘以一個給定的標量值&#xff1a; dst ( I ) saturate ( src1 ( I ) ? multiplier ) \…

持續集成與Jenkins安裝使用教程

一、持續集成與Jenkins 持續集成&#xff08;Continuous integration&#xff0c;簡稱CI&#xff09;指的是&#xff0c;頻繁地&#xff08;一天多次&#xff09;將代碼集成到主干。 持續集成的目的&#xff0c;就是讓產品可以快速迭代&#xff0c;同時還能保持高質量。 它的…

TIM定時器

一、TIM定時器 STM32高級定時器實戰&#xff1a;PWM、捕獲與死區控制詳解-CSDN博客 玩轉STM32_rivencode的博客-CSDN博客 二、相關函數 1.TIM_TimeBaseInitTypeDef結構體講解 typedef struct {uint16_t TIM_Prescaler; // 預分頻器&#xff0c;用于設置定時器計數頻…

Python 小練習系列 | Vol.14:掌握偏函數 partial,用函數更絲滑!

&#x1f9e9; Python 小練習系列 | Vol.14&#xff1a;掌握偏函數 partial&#xff0c;用函數更絲滑&#xff01; 本節的 Python 小練習系列我們將聚焦一個 冷門但高能 的工具 —— functools.partial。它的作用類似于“函數的預設模板”&#xff0c;能幫你寫出更加靈活、優雅…

開源 PDF.js 文件編輯操作

一、PDF.js PDF.js 是 Mozilla 基金會推出的一個使用 HTML5 構建的 PDF 閱讀器&#xff0c;它完全使用 JavaScript 編寫。作為 Firefox 瀏覽器的默認 PDF 查看器&#xff0c;PDF.js 具有強大的兼容性和穩定性。它不僅支持 PDF 文件的查看和渲染&#xff0c;還提供了豐富的交互…

3D珠寶渲染用什么軟件比較好?渲染100邀請碼1a12

印度珠寶商 Mohar Fine Jewels 和英國寶石商 Gemfields 在今年推出了合作珠寶系列——「Emeralds in Full Bloom」&#xff0c;它的靈感源自花草綻放的春季田野&#xff0c;共有 39 件作品&#xff0c;下面這個以植物為主題的開口手鐲就是其中一件。 在數字時代&#xff0c;像這…

增益調度控制 —— 理論、案例與交互式 GUI 實現

目錄 增益調度控制 —— 理論、案例與交互式 GUI 實現一、引言二、增益調度控制的基本原理三、數學模型與公式推導四、增益調度控制的優勢與局限4.1 優勢4.2 局限五、典型案例分析5.1 案例一:航空飛行控制中的增益調度5.2 案例二:發動機推力控制中的增益調度5.3 案例三:化工…

PyTorch數據加載流程解析

1. 定義最簡單的Dataset import torch from torch.utils.data import Dataset, DataLoaderclass MyDataset(Dataset):def __init__(self, data):self.data data # 假設data是一個列表&#xff0c;如[10, 20, 30, 40]def __len__(self):return len(self.data) # 返回數據總量…

xsync腳本是一個基于rsync的工具

xsync腳本是一個基于rsync的工具&#xff0c;用于在集群間高效同步文件或目錄。以下是xsync腳本的詳細使用方法和配置步驟&#xff1a; 一、xsync腳本的作用 xsync腳本可以快速將文件或目錄分發到集群中的多個節點&#xff0c;避免了手動逐臺復制文件的繁瑣操作。它利用rsync…

250408_解決加載大量數據集速度過慢,耗時過長的問題

250408_解決加載Cifar10等大量數據集速度過慢&#xff0c;耗時過長的問題&#xff08;加載數據時多線程的坑&#xff09; 在做Cifar10圖像分類任務時&#xff0c;發現每個step時間過長&#xff0c;且在資源管理器中查看顯卡資源調用異常&#xff0c;主要表現為&#xff0c;顯卡…

Ansible的使用2

#### 一、Ansible變量 ##### facts變量 > facts組件是Ansible用于采集被控節點機器的設備信息&#xff0c;比如IP地址、操作系統、以太網設備、mac 地址、時間/日期相關數據&#xff0c;硬件信息等 - setup模塊 - 用于獲取所有facts信息 shell ## 常用參數 filter…

多模態大語言模型arxiv論文略讀(六)

FashionLOGO: Prompting Multimodal Large Language Models for Fashion Logo Embeddings ?? 論文標題&#xff1a;FashionLOGO: Prompting Multimodal Large Language Models for Fashion Logo Embeddings ?? 論文作者&#xff1a;Zhen Wang, Da Li, Yulin Su, Min Yang,…