Springboot实现HandlerInterceptor拦截器

在这儿说一下我的实现步骤

首先创建自己的HandlerInterceptor类,继承HandlerInterceptor,并实现内部的三个方法

注意:内部使用了@Configuration注解,从Spring3.0开始,@Configuration用于定义配置类,可替换xml配置文件,首先请确保你的spring大于3.0哦。

package com.example.demo.controller;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import java.io.IOException;

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

public class MyHandlerInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException {
        /*该方法将在请求处理之前进行调用,只有该方法返回true,才会继续执行后续的Interceptor和Controller,
        当返回值为true 时就会继续调用下一个Interceptor的preHandle 方法,
        如果已经是最后一个Interceptor的时候就会是调用当前请求的Controller方法;*/
        //-----------------------------------------------------------------------------
        //----------------可以在此处进行编写你的拦截逻辑,下面来个例子------------------------
        //打印此次请求的SessionId
        System.out.println(request.getSession().getId());
        //判断此次的请求是否为域请求,如果是则不拦截
        if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
            return true;
        }
        //获取请求的头部中键为token的部分
        String token = request.getHeader("token");
        //我这里使用了Redis服务,存储对象,这里可以实现你自己的逻辑哦
        if (null == mRedisUtil.get(token)) {
            //此处使用打印的方式实现返回,而不是使用抛出异常的方式来进行
            response.setHeader("content-type", "application/json;charset=UTF-8");
            response.getWriter().println("请先登录哦!");
            return false;
        }
        //--------------------------以上是例子哦,不用贴过去的-----------------------------
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
        /*该方法也是需要当前对应的Interceptor的preHandle方法的返回值为true时才会执行,
        该方法将在整个请求结束之后,也就是在DispatcherServlet 渲染了对应的视图之后执行。
        用于进行资源清理。*/
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        /*该方法将在请求处理之后,DispatcherServlet进行视图返回渲染之前进行调用,
        可以在这个方法中对Controller 处理之后的ModelAndView 对象进行操作。*/
    }
}

我们主要使用的是preHandle方法来进行拦截操作,然后在内部实现具体拦截逻辑。

然后需要给我的拦截器配置ConfigurerAdapter

接下来新建一个我们自己的ConfigurerAdapter继承WebMvcConfigurerAdapter

package com.example.demo.controller;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@Configuration
public class MyWebAppConfigurer extends WebMvcConfigurerAdapter {

    @Bean
    public MyHandlerInterceptor pagePopulationInterceptor() {
        //在此处使用我们自己的HandlerInterceptor
        return new MyHandlerInterceptor();
    }
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 多个拦截器组成一个拦截器链
        // addPathPatterns 用于添加拦截规则
        // excludePathPatterns 用户排除拦截
        registry.addInterceptor(pagePopulationInterceptor()).addPathPatterns("/**");
        super.addInterceptors(registry);
    }

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        //这里可以重写这个方法来解决域请求的问题哦,如果不需要可以删除的
        registry.addMapping("/**");
    }
}

到此,我们就可以实现Springboot的请求拦截啦~有帮助的话麻烦动动小指点个赞哦

猜你喜欢

转载自blog.csdn.net/LikeBoke/article/details/85328421