• Spring拦截器的简单应用


    Spring 中提供了具体的实现拦截器: HandlerInterceptor ,拦截器的实现分为以下两个步骤:
    1. 创建自定义拦截器,实现 HandlerInterceptor 接口的 preHandle (执行具体方法之前的预处理)
    方法。
    2. 将自定义拦截器加入 WebMvcConfigurer addInterceptors 方法中。
    演示用户登录权限的校验:
    1.自定义拦截器
    1. // 如果用户未登录,则直接重定向到登录页,不会走到后续操作
    2. @Slf4j
    3. @Component
    4. public class LoginInterceptor implements HandlerInterceptor {
    5. @Autowired
    6. public LoginInterceptor() {
    7. log.info("LoginInterceptor.LoginInterceptor()");
    8. }
    9. @Override
    10. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    11. log.info("LoginInterceptor.preHandle()");
    12. Object currentUser = null;
    13. HttpSession session = request.getSession(false);
    14. if (session != null) {
    15. currentUser = session.getAttribute("currentUser");
    16. }
    17. if (currentUser == null) {
    18. // 说明用户未登录
    19. log.info("LoginInterceptor.preHandle: 用户未登录,重定向到 登录页(/login.html)");
    20. response.sendRedirect("/login.html");
    21. //位
    22. return false;
    23. }
    24. log.info("LoginInterceptor.preHandle: 用户登录了,继续后续操作。当前用户: {}", currentUser);
    25. //位true就可以继续的往下执行
    26. return true;
    27. }
    28. @Override
    29. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    30. }
    31. @Override
    32. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    33. }
    34. }

    1. 有个拦截器对象(自己new 或者 交给 Spring)
    2. 需要将对象注册,并且关联到某些 URL(哪些 URL 会应用拦截器),通过 WebConfigurator  bean 来注册

    1. @Slf4j
    2. // 1. 必须是一个 Spring bean(否则没有机会调用)
    3. // 2. 必须实现了 WebMvcConfigurer 接口
    4. @Configuration
    5. public class WebConfig implements WebMvcConfigurer {
    6. // 由于我们的拦截器已经注册给 Spring 了,所以,可以使用注入的方式
    7. private final LoginInterceptor loginInterceptor;
    8. @Autowired
    9. public WebConfig(LoginInterceptor loginInterceptor) {
    10. this.loginInterceptor = loginInterceptor;
    11. log.info("WebConfig.WebConfig()");
    12. }
    13. @Override
    14. public void addInterceptors(InterceptorRegistry registry) {
    15. // 在这个方法中注册拦截器
    16. registry.addInterceptor(loginInterceptor)
    17. .addPathPatterns("/**") // 应用到所有 URL 上
    18. .excludePathPatterns("/error") // 只要有错误,都会到这
    19. .excludePathPatterns("/login.do")
    20. .excludePathPatterns("/login.html"); // 但是 /login.html 是例外
    21. // 先添加的拦截器,先被应用
    22. log.info("WebConfig.addInterceptors()");
    23. }
    24. }

    对应的网页的入口

    1. @Slf4j
    2. @Controller
    3. public class LoginDoController {
    4. @Autowired
    5. public LoginDoController() {
    6. log.info("LoginDoController.LoginDoController()");
    7. }
    8. @PostMapping("/login.do")
    9. public String login(String username, String password, HttpSession session) {
    10. Map user = new LinkedHashMap<>();
    11. user.put("username", username);
    12. user.put("password", password);
    13. session.setAttribute("currentUser", user);
    14. log.info("LoginDoController.login: 登录成功,重定向到首页(/)");
    15. return "redirect:/";
    16. }
    17. }

     

  • 相关阅读:
    Linux:进程间通信
    WCF配置文件详解
    springboot集成qq邮箱
    Java 中如何比较两个BigDecimal 以及BigDecimal的坑
    CF - D. Letter Picking(博弈 + 区间dp)
    《算法笔记》图专题
    SA8155P Flat Build QFIL刷机
    【前端】提升效率的快捷键,数学知识,ASCLL码,图片格式
    Qwen 通义千问 14B 模型,长文本问答效果测试
    java计算机毕业设计高校科研信息管理系统源码+mysql数据库+系统+lw文档+部署
  • 原文地址:https://blog.csdn.net/m0_58196614/article/details/126651172