学习进度条

今日所花时间:一小时
今日代码量:150行
博客量:两篇
了解到的知识点:登录拦截器的使用 分组校验的使用

登录拦截器测试:

1.创建登录拦截器

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@Component
public class LoginInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        HttpSession session = request.getSession();
        // 检查session中是否有用户信息
        if (session.getAttribute("user") == null) {
            // 未登录,重定向到登录页面
            response.sendRedirect("/login");
            return false;
        }
        // 已登录,继续执行
        return true;
    }
}

2.配置拦截器

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private LoginInterceptor loginInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 注册拦截器,并指定拦截的路径
        registry.addInterceptor(loginInterceptor)
                .addPathPatterns("/**") // 拦截所有路径
                .excludePathPatterns("/login", "/register", "/css/**", "/js/**", "/images/**"); // 排除登录、注册和静态资源路径
    }
}

控制器实例

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HomeController {

    @GetMapping("/")
    public String home() {
        return "home";
    }

    @GetMapping("/login")
    public String login() {
        return "login";
    }

    @GetMapping("/register")
    public String register() {
        return "register";
    }
}

登录处理

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.http.HttpSession;

@Controller
public class LoginController {

    @PostMapping("/login")
    public String login(@RequestParam String username, @RequestParam String password, HttpSession session) {
        // 简单的登录验证逻辑
        if ("admin".equals(username) && "password".equals(password)) {
            session.setAttribute("user", username);
            return "redirect:/";
        } else {
            return "redirect:/login";
        }
    }
}

实例:

LoginInterceptor

package com.example.day0225.interceptors;

import com.example.day0225.pojo.Result;
import com.example.day0225.utils.JwtUtil;
import com.example.day0225.utils.ThreadLocalUtil;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import java.util.Map;

@Component
public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 令牌验证
        String token = request.getHeader("Authorization");
        // 验证token
        if (token == null) {
            // http响应代码为401
            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
            return false;
        }
        try {
            Map<String, Object> claims = JwtUtil.parseToken(token);
            //把业务数据存储到ThreadLocal中
            ThreadLocalUtil.set(claims);
            // 放行
            return true;
        } catch (Exception e) {
            // http响应代码为401
            response.setStatus(401);
            // 不放行
            return false;
        }
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        //清空ThreadLocal中的数据
        ThreadLocalUtil.remove();
//        HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
    }

}

配置拦截器

package com.example.day0225.config;

import com.example.day0225.interceptors.LoginInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private LoginInterceptor loginInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 拦截所有路径
        registry.addInterceptor(loginInterceptor)
                .addPathPatterns("/**")
                // 排除登录接口和注册接口
                .excludePathPatterns("/user/login", "/user/register");
    }
}

分组校验

//    分组校验
//    把校验项进行归类分组,在完成不同的功能的时候,校验指定组中的校验项
//    1.定义分组(在实体类内部定义接口)
//    2.定义校验项时指定归属的分组(通过groups属性指定)
//    3.校验时指定要校验的分组(给@Validated注解的value属性赋值)
//    校验项默认属于什么组(Default组)
    public interface Add extends Default {

    }
    public interface Update extends Default{

    }
//    如果说某个校验项没有指定分组,默认值属于Default分组
//    分组之间可以继承,A extends B ,那么A中拥有B中所有校验项
posted @ 2025-03-04 11:02  haoyinuo  阅读(33)  评论(0)    收藏  举报