SpringBoot开发,如何使用session做登陆权限验证?
发布于 作者:苏南大叔 来源:程序如此灵动~

在上一篇文章里面,苏南大叔实现了登陆逻辑的数据库相关对接。但是,里面遗留了一个权限验证的问题,也就是写session
和读取session
的问题,本文在这里做进一步的内容补充。
苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码编程经验总结。测试环境:win10
,openjdk@23.0.2
,IntelliJ IDEA 2024.3.4.1
,maven@3.3.2
,spring boot@2.5.4
,java@17
,mysql@5.7.26
。
基础代码
由于篇幅限制,数据库相关的代码登陆逻辑,可以参考上一篇文章:
LoginController
这里新增了logout
和success
两个页面,这里修改一下controller/LoginController.java
的代码:
package com.example.demo.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import com.example.demo.model.User;
import com.example.demo.repository.UserRepository;
import javax.servlet.http.HttpSession;
@Controller
public class LoginController {
@Autowired
private UserRepository userRepository;
@GetMapping("/login")
public String showLoginPage(HttpSession session) {
if (session.getAttribute("user") != null) {
return "redirect:/success";
}
return "login";
}
@PostMapping("/login")
public String login(@RequestParam("username") String username,
@RequestParam("password") String password,
HttpSession session,
Model model) {
if (isValidUser(username, password)) {
session.setAttribute("user", username);
return "redirect:/success";
} else {
model.addAttribute("error", "Invalid username or password");
return "login";
}
}
@GetMapping("/success")
public String showSuccessPage(HttpSession session, Model model) {
if (session.getAttribute("user") == null) {
return "redirect:/login";
}
model.addAttribute("user", session.getAttribute("user"));
return "success";
}
@GetMapping("/logout")
public String logout(HttpSession session) {
session.invalidate();
return "redirect:/login";
}
private boolean isValidUser(String username, String password) {
User user = userRepository.findByName(username);
// System.out.println("user: " + user + username + password);
if (user != null && user.getPassword().equals(password)) {
return true;
}
return false; // Replace with actual user validation logic
}
}
这个代码要是按着thinkphp
的思路理解的话,恐怕是要出大乱子的。而作为springboot
框架,只有被贴上@GetMapping
或者@PostMapping
相关字样的,才会被注册为url
。所以,并不会有啥问题。
核心代码
import javax.servlet.http.HttpSession;
session.setAttribute("user", username);
session.getAttribute("user")
session.invalidate();
登陆成功页
新增页面templates/success.html
:
<p>Welcome, <span th:text="${session.user}"></span>!</p>
<form th:action="@{/logout}" method="get">
<button type="submit">Logout</button>
</form>
登陆判断
是否登陆的判断依据就是:
request.getSession().getAttribute("user") != null
包装成一个可以四处调用的方法:
private boolean isLoggedIn(HttpServletRequest request) {
return request.getSession().getAttribute("user") != null;
}
调用方式举例:
public ResponseEntity<?> test(HttpServletRequest request) {
if (!isLoggedIn(request)) {
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("User not logged in");
}
//...
}
org.springframework.security
当然了,spring
官方也有个org.springframework.security
。所做的事情,和本文的代码差不多,可以统一进行配置。不过,经过苏南大叔的实验后,得出的结论是:太复杂太难用了。被各种配置文件的支配感,油然而生。文档参考:
org.springframework.security
虽然也能得到本文的效果,但是org.springframework.security
要做的修改,表面上简单,实际上非常复杂,不建议使用。
结语
随便说一句啊,服务器端的session
是以客户端的cookie
为定位依据的。所以,客户端cookie
没有或者失效的话,服务器端的session
就无法定位到了。这个逻辑是和php
那边一致的。
更多苏南大叔的java
相关经验文字,请点击链接:


