前言

新的项目需要校验用户是否登录 在springBoot项目中添加一个自定义的拦截器拦截到所有请求进行逻辑判断

步骤如下:

首先新建一个自己的拦截器

自己的拦截器需要实现HandlerInterceptor 接口 并重写自己需要的方法 preHandle 在请求实际到达controller之前拦截校验

import com.alibaba.fastjson.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * @author liang
 */
public class ApiLoginInterceptor implements HandlerInterceptor {

    private final Logger logger = LoggerFactory.getLogger(ApiLoginInterceptor.class);

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        //进行一些你自己的业务校验 如果校验失败了 用 returnJson向response写入返回的内容
        if (true){
            returnJson(response,new ResultVO(ResultEnum.SYS_OPERATE_FAIL));
            return false;
        }
        return true;
    }

    private void returnJson(HttpServletResponse response, ResultVO resultVO) {
        response.setCharacterEncoding("UTF-8");
        response.setContentType("application/json; charset=utf-8");
        try (PrintWriter writer = response.getWriter()) {
            String res = JSONObject.toJSONString(resultVO);
            writer.print(res);
        } catch (IOException e) {
            logger.error("exception:", e);
        }
    }


}

其次 把自己的拦截器注册到spring中 让其生效

实现WebMvcConfigurer类 并将类用@Configuration注解标注 他为一个配置类 实际是包含了@Component注解将此类注入到了spring容器中

import org.springframework.context.annotation.Bean;
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 WebConfigurer implements WebMvcConfigurer {

    @Bean
    public ApiLoginInterceptor apiLoginInterceptor(){
        return new ApiLoginInterceptor();
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(apiLoginInterceptor()).addPathPatterns("/api/**")
                .excludePathPatterns("/api/haha/he");
    }
}

注意addPathPatterns是拦截器需要拦截的请求路径 支持通配符格式的匹配,也支持全路径 excludePathPatterns是不进行拦截的请求路径,匹配模式相同 这里也可以不用这两个属性而是自己写一个自定义注解 在自定义的拦截器中判断方法是否有注解来决定是否放行(注意路径里面不要写项目的context-path他是从context-path之后开始匹配的)

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐