hocvietcode.com
  • Trang chủ
  • Học lập trình
    • Lập trình C/C++
    • Cấu trúc dữ liệu và giải thuật
    • Lập trình HTML
    • Lập trình Javascript
      • Javascript cơ bản
      • ReactJS framework
      • AngularJS framework
      • Typescript cơ bản
      • Angular
      • NodeJS
    • Lập trình Mobile
      • Lập Trình Dart Cơ Bản
        • Dart Flutter Framework
    • Cơ sở dữ liệu
      • MySQL – MariaDB
      • Micrsoft SQL Server
      • Extensible Markup Language (XML)
      • JSON
      • MongoDB
    • Lập trình PHP
      • Lập trình PHP cơ bản
      • Laravel Framework
    • Lập trình Java
      • Java Cơ bản
      • Spring Boot
    • Lập trình C#
      • Lập Trình C# Cơ Bản
      • ASP.NET Core MVC
    • Lập trình Python
    • Git và Github
    • Machine Learning
  • WORDPRESS
    • WordPress cơ bản
    • WordPress nâng cao
    • Chia sẻ WordPress
  • Kiến thức hệ thống
    • Microsoft Azure
    • Docker
    • Linux
    • Mạng và truyền thông
  • Chia sẻ IT
    • Tin học văn phòng
      • Microsoft Word
      • Microsoft Excel
    • Marketing
      • Google Adwords
      • Facebook Ads
      • Kiến thức khác
    • Chia sẻ phần mềm
    • Review công nghệ
    • Công cụ – tiện ích
      • Kiểm tra bàn phím online
      • Kiểm tra webcam online
Đăng nhập
  • Đăng nhập / Đăng ký

Please enter key search to display results.

Home
  • Spring Boot
Spring Boot bài 11: Post/Redirect/Get, flash message và session
Java và Spring Boot – MVC và REST API

Spring Boot bài 11: Post/Redirect/Get, flash message và session

  • 18-10-2026
  • Toanngo92
  • 0 Comments

Giáo trình Spring Boot MVC và REST API · Chương 5/12: Biểu mẫu, validation và điều hướng · Bài 11/28 · Biên soạn tháng 10/2026.

← Bài 10 · Mục lục 12 chương · Bài 12 →

Mục lục

  • Mục tiêu bài học
  • Vì sao không render danh sách ngay sau POST?
  • Flash không giống query parameter
  • Session có ích nhưng không phải database
  • PRG không phải cơ chế chống ghi trùng toàn diện
  • Lỗi thường gặp và lưu ý
  • Ghi nhớ
  • Tài liệu đối chiếu

Mục tiêu bài học

Tránh gửi lại biểu mẫu khi refresh, đưa thông báo qua redirect và dùng session đúng phạm vi.

Vì sao không render danh sách ngay sau POST?

Nếu POST tạo khóa học rồi trả trực tiếp HTML danh sách, URL và request cuối của trình duyệt vẫn là POST. Khi refresh, trình duyệt có thể hỏi gửi lại dữ liệu và tạo thêm một bản ghi. Post/Redirect/Get giải quyết luồng điều hướng này: xử lý POST thành công, trả redirect, rồi trình duyệt gửi GET tới trang kết quả.

Trong CourseWebController, khi lưu thành công, Controller trả redirect:/courses. Còn khi có lỗi validation, nó trả courses/form để giữ dữ liệu và lỗi của lần nhập. Hai trường hợp có chủ đích khác nhau, không phải mọi POST đều phải redirect bất kể kết quả.

flash.addFlashAttribute("message", "Đã thêm khóa học");
return "redirect:/courses";
<p class="message" th:if="${message}" th:text="${message}"></p>

Flash không giống query parameter

Flash attribute được chuyển tới request tiếp sau qua cơ chế flash map của Spring; theo cấu hình thông thường, nó dùng session trong thời gian ngắn. Nó không xuất hiện như message=… trên URL và không dành để giữ dữ liệu lâu dài. GET trang đích render thông báo, lần tải tiếp theo thông báo thường không còn.

Query parameter phù hợp để giữ bộ lọc có thể chia sẻ hoặc đánh dấu trang, như q và page. Flash phù hợp thông báo “đã lưu”. Không để mật khẩu hoặc dữ liệu nhạy cảm trong URL vì URL có thể xuất hiện trong lịch sử, log và liên kết chia sẻ.

Session có ích nhưng không phải database

Session có thể giữ trạng thái đăng nhập hoặc dữ liệu tạm theo người dùng. Không lưu entity JPA đang được quản lý hoặc cả danh sách khóa học vào session để né truy vấn; dữ liệu dễ cũ và làm tăng bộ nhớ. Nghiệp vụ cần lưu bền phải vào database và có cơ chế kiểm tra quyền mỗi lần truy cập.

Spring Security quản lý authentication trong phiên đăng nhập; không cần tự tạo session attribute isAdmin rồi kiểm tra rải rác. Khi triển khai nhiều instance, trạng thái session cần được tính đến qua chiến lược phân phối hoặc lưu session tập trung; một session trong bộ nhớ không tự chia sẻ giữa các container.

PRG không phải cơ chế chống ghi trùng toàn diện

PRG giúp refresh GET không lặp lại POST vừa rồi, nhưng không ngăn hai lần bấm nút nhanh, hai request mạng hoặc client retry. Với đơn hàng, thanh toán hay thao tác cần đúng một lần, phải bổ sung ràng buộc dữ liệu, khóa nghiệp vụ hoặc idempotency key phù hợp.

Thực hiện thử: tạo một khóa học, quan sát Network thấy POST rồi redirect và GET, bấm refresh ở trang danh sách và xác nhận số dòng không tăng. Kiểm thử MockMvc xác nhận redirect URL; một kiểm tra trình duyệt bổ sung giúp nhìn thấy hành vi của người dùng thật. Không chỉ dựa vào việc thông báo màu xanh xuất hiện.

Lỗi thường gặp và lưu ý

  • Không dùng redirect để che lỗi validation rồi làm mất nội dung người dùng nhập.
  • Không coi flash message hoặc biến session là bằng chứng thao tác database đã thành công; kết quả giao dịch mới quyết định.

Ghi nhớ

Dùng PRG cho POST thành công, flash cho thông báo ngắn và session cho trạng thái phù hợp theo người dùng.

Tài liệu đối chiếu

  • Flash Attributes

← Bài 10 · Mục lục 12 chương · Bài 12 →

Bài viết liên quan:

Java và Spring Boot – MVC và REST API
Spring Boot bài 10: Validation và BindingResult: báo lỗi ngay trên biểu mẫu
Java và Spring Boot – MVC và REST API
Spring Boot bài 27: Logging, Actuator và quản lý schema bằng Flyway
Java và Spring Boot – MVC và REST API
Spring Boot bài 12: JPA Entity, Repository, H2 và migration đầu tiên
Java và Spring Boot – MVC và REST API
Spring Boot bài 28: Đóng gói JAR, Docker và cấu hình triển khai
Java và Spring Boot – MVC và REST API
Spring Boot bài 13: Kết nối MySQL, CRUD và transaction trong Service
Java và Spring Boot – MVC và REST API
Giáo trình Spring Boot MVC và REST API 2026: 12 chương, 28 bài
Java và Spring Boot – MVC và REST API
Spring Boot bài 14: Quan hệ JPA, DTO và tránh truy vấn N+1
Java và Spring Boot – MVC và REST API
Spring Boot bài 15: Tìm kiếm, phân trang và sắp xếp có kiểm soát
Java và Spring Boot – MVC và REST API
Spring Boot bài 16: Upload và download tài liệu có giới hạn
Java và Spring Boot – MVC và REST API
Spring Boot bài 17: Spring Security: đăng nhập, mật khẩu và SecurityFilterChain
Java và Spring Boot – MVC và REST API
Spring Boot bài 18: Phân quyền teacher/student và bảo vệ endpoint
Java và Spring Boot – MVC và REST API
Spring Boot bài 19: CSRF, CORS và gọi API có session đúng cách

Dịch vụ thiết kế Wesbite

NỘI DUNG MỚI CẬP NHẬT

Kiến trúc máy tính: CPU, RAM, ALU, bus và bộ nhớ cache

Kiến trúc máy tính – Bài 4: RAM, cache và bộ nhớ ảo khác nhau thế nào?

Kiến trúc máy tính: CPU, RAM, ALU, bus và bộ nhớ cache

Kiến trúc máy tính – Bài 3: CPU điều khiển và trao đổi dữ liệu qua bus thế nào?

Kiến trúc máy tính: CPU, RAM, ALU, bus và bộ nhớ cache

Kiến trúc máy tính – Bài 5: Thiết bị vào/ra, ngắt, DMA và RAID

Kiến trúc máy tính: CPU, RAM, ALU, bus và bộ nhớ cache

Kiến trúc máy tính – Bài 2: CPU thực hiện phép tính 5 + 3 như thế nào?

Kiến trúc máy tính: CPU, RAM, ALU, bus và bộ nhớ cache

Kiến trúc máy tính – Bài 1: Máy tính hoạt động như thế nào?

Giới thiệu

hocvietcode.com là website chia sẻ và cập nhật tin tức công nghệ, chia sẻ kiến thức, kỹ năng. Chúng tôi rất cảm ơn và mong muốn nhận được nhiều phản hồi để có thể phục vụ quý bạn đọc tốt hơn !

Liên hệ quảng cáo: [email protected]

Kết nối với HỌC VIẾT CODE

© hocvietcode.com - Tech888 Co .Ltd since 2019

Đăng nhập

Trở thành một phần của cộng đồng của chúng tôi!
Registration complete. Please check your email.
Đăng nhập bằng google
Đăng kýBạn quên mật khẩu?

Create an account

Welcome! Register for an account
The user name or email address is not correct.
Registration confirmation will be emailed to you.
Log in Lost your password?

Reset password

Recover your password
Password reset email has been sent.
The email could not be sent. Possible reason: your host may have disabled the mail function.
A password will be e-mailed to you.
Log in Register
×