当前位置: 首页 > news >正文

写一个简单食用的拦截器

写个Filter继承OncePerRequestFilter重写doFilterInternal
1、doFilterInternal方法
@WebFilter(filterName = "tenantAuthCheckFilter", urlPatterns = {"/v1/url/*"})
@Order(1)
public class TenantFilter extends OncePerRequestFilter {

    @Autowired
    private ServiceA serviceA;

    @Autowired
    private ExcludePathsConfig excludePathsConfig;

    @Override
    protected void doFilterInternal(@NotNull HttpServletRequest request, @NotNull HttpServletResponse response, @NotNull FilterChain filterChain) throws ServletException, IOException {
        String servletPath = request.getServletPath();
        String userId = request.getHeader("userId");
        if (!excludePathsConfig.getPaths().contains(servletPath)) {
            User user = ServiceA.getProdInst(prodInstId);
            if(user.getUserId!=userId){
                throw new Exception("当前用户没权限");
            }
        }
        filterChain.doFilter(request, response);
    }
}

2、 将applicaiton.yml下的配置读取成List<String>

@Component
@ConfigurationProperties(prefix = "interceptorconfig.exclude")
@Data
public class ExcludePathsConfig {
    private List<String> paths;
}

3、application.yml配置 

interceptorconfig: # 拦截器配置
  exclude:
    paths:
      - /v1/url/userList # 不拦截这个接口
      - /v1/url/dict # 不拦截这个接口

4、启动类增加ServletComponentScan()

@ServletComponentScan(basePackages = {"cn.lihaiyu.test.*"})

5、Filter抛出错误方案

@RestController
public class ErrorController extends BasicErrorController {

    public ErrorController() {
        super(new DefaultErrorAttributes(), new ErrorProperties());
    }

    @RequestMapping(produces = {MediaType.APPLICATION_JSON_VALUE})
    @Override
    public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {
        Map<String, Object> errorAttributes = getErrorAttributes(request, ErrorAttributeOptions.of(ErrorAttributeOptions.Include.EXCEPTION,ErrorAttributeOptions.Include.MESSAGE,ErrorAttributeOptions.Include.STACK_TRACE,ErrorAttributeOptions.Include.BINDING_ERRORS));
        HttpStatus status = getStatus(request);
        // 错误代码:-1
        String code = String.valueOf(ErrorType.SYS_ERROR.getCode());
        // 获取错误信息
        String message = errorAttributes.get("message").toString();

        ApiErrorResult apiErrorResult = new ApiErrorResult(code,message);
        return new ResponseEntity<>(apiErrorResult,status);
    }
}
public class ApiErrorResult extends LinkedHashMap<String,Object> {

    private static final String CODE_KEY = "code";
    private static final String MESSAGE_KEY =  "message";

    public ApiErrorResult(String code, String message) {
        this.put(CODE_KEY,code);
        this.put(MESSAGE_KEY,message);
    }
}

6、需要注意的地方:

① 使用ServletComponentScan

SpringBootApplication 上使用@ServletComponentScan 注解后
Servlet可以直接通过@WebServlet注解自动注册
Filter可以直接通过@WebFilter注解自动注册
Listener可以直接通过@WebListener 注解自动注册

原文链接:https://blog.csdn.net/qq_35574640/article/details/87936672

② 不要在Filter上面使用@Component,否则 urlPatterns 失效,会拦截所有的请求

③ 抛出错误的方法,filter内无法直接抛出错误,需要借助 BasicErrorController

相关文章:

  • 算法竞赛进阶指南 0x68 二分图的匹配
  • 【无标题】数字ic设计|ic芯片设计全流程
  • Stable Diffusion搭建全过程记录,生成自己的专属艺术照
  • 【iOS自动化测试】第二章:环境安装
  • 源码安装LAMT架构
  • 重要文件即时搞定,不用插电就能打印,汉印MT800移动便携打印机上手
  • MySQL数据库性能分析之explain使用
  • 猿创征文|Linux centos7下利用docker快速部署SQLserver测试学习环境
  • 关于webpack面试题
  • 【图像处理】道格拉斯-普克算法(曲线的折线段逼近)
  • 工地安全着装识别系统
  • 【Elasticsearch教程16】Mapping字段类型之join
  • 2 springboot全局配置
  • 2022 - 8 洛谷
  • 推荐系统 | 基础推荐模型 | 矩阵分解 | 矩阵分解的PyTorch实现
  • Django 博客开发教程 16 - 统计文章阅读量
  • Facebook AccountKit 接入的坑点
  • FastReport在线报表设计器工作原理
  • Next.js之基础概念(二)
  • OSS Web直传 (文件图片)
  • Spark RDD学习: aggregate函数
  • 对象管理器(defineProperty)学习笔记
  • 基于Android乐音识别(2)
  • 解析 Webpack中import、require、按需加载的执行过程
  • 判断客户端类型,Android,iOS,PC
  • 山寨一个 Promise
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 想写好前端,先练好内功
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • 原生js练习题---第五课
  • ​iOS安全加固方法及实现
  • ​VRRP 虚拟路由冗余协议(华为)
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • ###C语言程序设计-----C语言学习(6)#
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (2)nginx 安装、启停
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (多级缓存)缓存同步
  • (二)丶RabbitMQ的六大核心
  • (附源码)ssm码农论坛 毕业设计 231126
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • (转)Linq学习笔记
  • (转载)PyTorch代码规范最佳实践和样式指南
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • .net 按比例显示图片的缩略图
  • .NET 指南:抽象化实现的基类
  • .net/c# memcached 获取所有缓存键(keys)
  • .Net开发笔记(二十)创建一个需要授权的第三方组件
  • @TableId注解详细介绍 mybaits 实体类主键注解
  • @Transactional 竟也能解决分布式事务?
  • [AIGC] MySQL存储引擎详解
  • [BUUCTF NewStarCTF 2023 公开赛道] week3 crypto/pwn