学习进度条
今日所花时间:一小时
今日代码量: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中所有校验项

浙公网安备 33010602011771号