• SpringBoot的HandlerInterceptor拦截器使用方法


    一、创建拦截器

    通过实现HandlerInterceptor接口创建自己要使用的拦截器

    1. import org.springframework.context.annotation.Configuration;
    2. import org.springframework.web.servlet.HandlerInterceptor;
    3. import org.springframework.web.servlet.ModelAndView;
    4. import javax.servlet.http.HttpServletRequest;
    5. import javax.servlet.http.HttpServletResponse;
    6. @Configuration
    7. public class LoginTicketInterceptor implements HandlerInterceptor {
    8. /**
    9. * preHandle最先执行的方法
    10. * @param request 请求
    11. * @param response 响应
    12. * @param handler 当前请求请求的控制器方法对象 DemoController#demo
    13. * @return
    14. * @throws Exception
    15. */
    16. @Override
    17. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    18. System.out.println("==========1=============");
    19. return true;
    20. }
    21. /**
    22. *
    23. * @param request
    24. * @param response
    25. * @param handler 当前请求请求的控制器方法对象 DemoController#demo
    26. * @param modelAndView 模型和视图 当前请求访问方法的modelandview对象
    27. * @throws Exception
    28. */
    29. @Override
    30. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    31. System.out.println("==========2=============");
    32. }
    33. /**
    34. *
    35. * @param request
    36. * @param response
    37. * @param handler 当前请求请求的控制器方法对象 DemoController#demo
    38. * @param ex 如果控制器出现异常时异常对象
    39. * @throws Exception
    40. * 这个方法相当于:try{}catch{}finally{}中的finally{}代码块 总是执行 无论请求正确或出现异常都会进入该方法
    41. */
    42. @Override
    43. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    44. System.out.println("==========3=============");
    45. }
    46. }

    其中preHandle方法是Http请求执行之前去执行的

    其中postHandle方法是执行请求路径的方法后去执行的

    其中afterCompletion方法是所有Http请求完成后去执行的

    这个是Http请求路径的方法

    1. import com.springboot3.domain.Course;
    2. import com.springboot3.domain.DataTime;
    3. import com.springboot3.mapper.CourseMapper;
    4. import lombok.extern.slf4j.Slf4j;
    5. import org.redisson.api.RLock;
    6. import org.redisson.api.RedissonClient;
    7. import org.springframework.beans.factory.annotation.Autowired;
    8. import org.springframework.data.redis.core.RedisTemplate;
    9. import org.springframework.web.bind.annotation.*;
    10. import javax.servlet.http.Cookie;
    11. import javax.servlet.http.HttpServletResponse;
    12. import java.time.LocalDateTime;
    13. import java.util.concurrent.ConcurrentHashMap;
    14. @RequestMapping("/course")
    15. @RestController
    16. @CrossOrigin
    17. @Slf4j
    18. public class CourseController {
    19. @Autowired
    20. private RedissonClient redissonClient;
    21. @Autowired
    22. private CourseMapper courseMapper;
    23. @Autowired
    24. private RedisTemplate redisTemplate;
    25. @GetMapping("/test/{id}")
    26. public ConcurrentHashMap test(@PathVariable("id")String id, HttpServletResponse response) {
    27. ConcurrentHashMap treeMap = new ConcurrentHashMap<>();
    28. RLock lock = null;
    29. try {
    30. Object courseRedis = redisTemplate.opsForValue().get(id);
    31. lock = redissonClient.getLock("CourseLock");
    32. lock.lock();
    33. if (courseRedis == null) {
    34. Course course = courseMapper.selectById(id);
    35. redisTemplate.opsForValue().set(course.getId(),course);
    36. dateTime(id, treeMap);
    37. }else{
    38. dateTime(id, treeMap);
    39. }
    40. } catch (Exception e) {
    41. throw new RuntimeException(e);
    42. } finally {
    43. lock.unlock();
    44. }
    45. Cookie cookie=new Cookie("ticket","ticket");
    46. cookie.setMaxAge(3600*2);
    47. response.addCookie(cookie);
    48. System.out.println("正在执行Course接口");
    49. return treeMap;
    50. }
    51. private void dateTime(String id, ConcurrentHashMap treeMap) {
    52. DataTime dataTime = new DataTime();
    53. dataTime.setData(redisTemplate.opsForValue().get(id));
    54. dataTime.setTime(LocalDateTime.now());
    55. treeMap.put("dataTime",dataTime);
    56. }
    57. }

    二、将拦截器注册到Spring中

    1. package com.springboot3.config;
    2. import com.springboot3.interceptor.LoginTicketInterceptor;
    3. import org.springframework.beans.factory.annotation.Autowired;
    4. import org.springframework.context.annotation.Configuration;
    5. import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
    6. import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
    7. @Configuration
    8. public class WebMvcConfig implements WebMvcConfigurer {
    9. @Autowired
    10. private LoginTicketInterceptor loginTicketInterceptor;
    11. @Override
    12. public void addInterceptors(InterceptorRegistry registry) {
    13. registry.addInterceptor(loginTicketInterceptor);
    14. }
    15. }

    三、测试结果

     

  • 相关阅读:
    转行学网络安全,月薪6k到30k,给兄弟们一些个人建议
    k8s-14_helm介绍以及使用
    pyhton如何判断字符串中是否只含有数字——isdigit函数的用法及实例
    记录一次爬虫接单项目【采集国际淘宝数据】
    opencv图像的本质
    《Docker极简教程》--Docker镜像--Docker镜像的管理
    (附源码)计算机毕业设计SSM建筑工地环保监控系统研究
    nodejs+vue 网上招聘系统elementui
    AJAX学习笔记3练习
    jar包的一些事儿
  • 原文地址:https://blog.csdn.net/weixin_55127182/article/details/132688429