SpringBoot的HandlerInterceptor拦截器使用方法

一、创建拦截器

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

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Configuration
public class LoginTicketInterceptor implements HandlerInterceptor {
    /**
     * preHandle最先执行的方法
     * @param request   请求
     * @param response  响应
     * @param handler   当前请求请求的控制器方法对象  DemoController#demo
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("==========1=============");
        return true;
    }
    /**
     *
     * @param request
     * @param response
     * @param handler   当前请求请求的控制器方法对象  DemoController#demo
     * @param modelAndView  模型和视图   当前请求访问方法的modelandview对象
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("==========2=============");
    }
    /**
     *
     * @param request
     * @param response
     * @param handler   当前请求请求的控制器方法对象  DemoController#demo
     * @param ex    如果控制器出现异常时异常对象
     * @throws Exception
     * 这个方法相当于:try{}catch{}finally{}中的finally{}代码块  总是执行    无论请求正确或出现异常都会进入该方法
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("==========3=============");
    }
}

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

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

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

这个是Http请求路径的方法

import com.springboot3.domain.Course;
import com.springboot3.domain.DataTime;
import com.springboot3.mapper.CourseMapper;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import java.time.LocalDateTime;
import java.util.concurrent.ConcurrentHashMap;

@RequestMapping("/course")
@RestController
@CrossOrigin
@Slf4j
public class CourseController {
    @Autowired
    private RedissonClient redissonClient;
    @Autowired
    private CourseMapper courseMapper;
    @Autowired
    private RedisTemplate redisTemplate;
    @GetMapping("/test/{id}")
    public ConcurrentHashMap  test(@PathVariable("id")String id, HttpServletResponse response) {
        ConcurrentHashMap treeMap = new ConcurrentHashMap<>();

        RLock lock = null;
        try {
            Object courseRedis = redisTemplate.opsForValue().get(id);
            lock = redissonClient.getLock("CourseLock");
            lock.lock();
            if (courseRedis == null) {
                Course course = courseMapper.selectById(id);
                redisTemplate.opsForValue().set(course.getId(),course);
                dateTime(id, treeMap);
            }else{
                dateTime(id, treeMap);
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            lock.unlock();
        }
        Cookie cookie=new Cookie("ticket","ticket");
        cookie.setMaxAge(3600*2);
        response.addCookie(cookie);
        System.out.println("正在执行Course接口");
        return treeMap;
    }

    private void dateTime(String id, ConcurrentHashMap treeMap) {
        DataTime dataTime = new DataTime();
        dataTime.setData(redisTemplate.opsForValue().get(id));
        dataTime.setTime(LocalDateTime.now());
        treeMap.put("dataTime",dataTime);
    }
}

二、将拦截器注册到Spring中

package com.springboot3.config;

import com.springboot3.interceptor.LoginTicketInterceptor;
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 WebMvcConfig implements WebMvcConfigurer {
    @Autowired
    private LoginTicketInterceptor loginTicketInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginTicketInterceptor);
    }
}

三、测试结果

SpringBoot的HandlerInterceptor拦截器使用方法_第1张图片 

你可能感兴趣的:(spring,boot,后端,java)