我们相信:世界是美好的,你是我也是。 来玩一下解压小游戏吧!

在上一篇文章里面,苏南大叔实现了登陆逻辑的数据库相关对接。但是,里面遗留了一个权限验证的问题,也就是写session和读取session的问题,本文在这里做进一步的内容补充。

苏南大叔:SpringBoot开发,如何使用session做登陆权限验证? - springboot-session
SpringBoot开发,如何使用session做登陆权限验证?(图3-1)

苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码编程经验总结。测试环境:win10openjdk@23.0.2IntelliJ IDEA 2024.3.4.1maven@3.3.2spring boot@2.5.4java@17mysql@5.7.26

基础代码

由于篇幅限制,数据库相关的代码登陆逻辑,可以参考上一篇文章:

LoginController

这里新增了logoutsuccess两个页面,这里修改一下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>

苏南大叔:SpringBoot开发,如何使用session做登陆权限验证? - 登陆成功及退出登陆
SpringBoot开发,如何使用session做登陆权限验证?(图3-2)

登陆判断

是否登陆的判断依据就是:

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");
    }
    //...
}

苏南大叔:SpringBoot开发,如何使用session做登陆权限验证? - session写法
SpringBoot开发,如何使用session做登陆权限验证?(图3-3)

org.springframework.security

当然了,spring官方也有个org.springframework.security。所做的事情,和本文的代码差不多,可以统一进行配置。不过,经过苏南大叔的实验后,得出的结论是:太复杂太难用了。被各种配置文件的支配感,油然而生。文档参考:

org.springframework.security虽然也能得到本文的效果,但是org.springframework.security要做的修改,表面上简单,实际上非常复杂,不建议使用。

结语

随便说一句啊,服务器端的session是以客户端的cookie为定位依据的。所以,客户端cookie没有或者失效的话,服务器端的session就无法定位到了。这个逻辑是和php那边一致的。

更多苏南大叔的java相关经验文字,请点击链接:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   java