首页 > 其他分享 >过滤器拦截器与异常捕获

过滤器拦截器与异常捕获

时间:2024-07-17 16:54:11浏览次数:8  
标签:拦截器 com 捕获 springframework org 过滤器 import servlet public

通过上文开发,系统已经能够进行初步的使用,但是需要进一步完善功能,

本篇介绍拦截器与过滤器还有关于异常的捕获的知识笔记

        下面开始        


过滤器Filter

  • 入门程序

    • 定义Filter类,实现Filter接口,并重写其所有方法

    • package com.testpeople.filter;
      
      import javax.servlet.*;
      import javax.servlet.annotation.WebFilter;
      import java.io.IOException;
      
      @WebFilter(urlPatterns = "/*")//拦截所有请求
      public class demoFilter implements Filter {
      
          //初始化方法,调用一次
          @Override
          public void init(FilterConfig filterConfig) throws ServletException {
              System.out.printf("初始化方法被调用");
          }
          //销毁方法,调用一次
          @Override
          public void destroy() {
              Filter.super.destroy();
              System.out.println("销毁方法被调用");
          }
      
          //过滤方法,调用多次
          @Override
          public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
              System.out.printf("拦截了请求");
      
              filterChain.doFilter(servletRequest,servletResponse);//放行操作
      
          }
      }
    • 配置Filter类加上@WebFilter注解,配置拦截资源路径。引导类上加@ServeltComponentScan开启servlet组件支持。

    • 效果
    •   
    •  未拦截
    • 详解

      • 执行流程

        • 放行后访问对应资源,资源访问完会回到过滤器中。

        • 回到过滤器中,会执行放行后的逻辑。

      • 拦截路径

  •  过滤器链
  • 登录校验

    • 设计思路

  • 开发

  • package com.testpeople.filter;
    
    import com.alibaba.fastjson.JSONObject;
    import com.testpeople.pojo.Result;
    import com.testpeople.utils.JwtUtils;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.util.StringUtils;
    
    import javax.servlet.*;
    import javax.servlet.annotation.WebFilter;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    @Slf4j
    @WebFilter(urlPatterns = "/*")
    public class LoginFilter implements Filter {
    
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
            Filter.super.init(filterConfig);
        }
    
        @Override
        public void destroy() {
            Filter.super.destroy();
        }
    
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    
            //强制类型转换请求和响应、
            HttpServletRequest request = (HttpServletRequest) servletRequest;
            HttpServletResponse response = (HttpServletResponse) servletResponse;
    
            //1.获取请求url
    
            String url = request.getRequestURI();
            log.info("请求的url:{}",url);
            //2.判断是否是登录操作
    
            if (url.contains("login")){
                log.info("此请求为登录,放行");
                filterChain.doFilter(request,response);
                return;
            }
    
            //3.获取请求头中的token
            String twj = request.getHeader("token");
    
            //4.判断令牌是否存在,若不存在,返回错误(未登录)
    
            if (!StringUtils.hasLength(twj)){
                log.info("请求头中token为空,返回错误(未登录)");
                Result error = Result.error("NOT_LOGIN");
                //手动转换将对象转换成json————————阿里巴巴工具包fastjson
                String notLogin = JSONObject.toJSONString(error);
                response.getWriter().write(notLogin);
                return;
            }
    
    
            //5.解析令牌,若解析失败,返回错误(未登录)
    
            try {
                JwtUtils.parseJwt(twj);
            } catch (Exception e) {//解析失败
                e.printStackTrace();
                log.info("令牌解析失败,返回错误(未登录)");
                Result error = Result.error("NOT_LOGIN");
                //手动转换将对象转换成json————————阿里巴巴工具包fastjson
                String notLogin = JSONObject.toJSONString(error);
                response.getWriter().write(notLogin);
                return;
            }
    
            //6.放行
            log.info("令牌合法,放行");
            filterChain.doFilter(request,response);
    
    
        }
    }
  • 测试

    • Postman

 拦截器interceptor

  • 简介

  • 入门程序

    • 定义拦截器,实现HandlerInterceptor接口,并重写其所有方法。(类)

    • 注册拦截器(类)

    • //用于定义拦截器,实现拦截功能
      
      package com.testpeople.interceptor;
      
      import org.springframework.stereotype.Component;
      import org.springframework.web.servlet.HandlerInterceptor;
      import org.springframework.web.servlet.ModelAndView;
      
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      
      @Component
      public class LoginCheckInterceptor implements HandlerInterceptor {
      
      
          @Override//目标方法资源运行前运行,返回值为true表示放行,false表示拦截
          public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
              System.out.println("preHandle");
              return true;
          }
      
          @Override//目标方法资源运行后运行
          public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
              System.out.println("postHandle");
          }
      
          @Override//视图渲染后运行,最后运行
          public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
              System.out.println("afterCompletion");
          }
      
      
      }
      //用于注册拦截器,实现拦截的路径。
      package com.testpeople.config;
      
      import com.testpeople.interceptor.LoginCheckInterceptor;
      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 WebConfig implements WebMvcConfigurer {
      
          @Autowired
          private LoginCheckInterceptor loginCheckInterceptor;
          @Override //注册拦截器
          public void addInterceptors(InterceptorRegistry registry) {
              registry.addInterceptor(loginCheckInterceptor).addPathPatterns("/**");
          }
      }
    • 测试

      • 不放行

  • 放行

  • 详解

    • 拦截路径

@Override //注册拦截器
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(loginCheckInterceptor).addPathPatterns("/**").excludePathPatterns("/login");
}
//addPathPatterns表示拦截什么,excludePatterns表示不拦截什么
//"/**"与"/*"的区别
  • 执行流程

  • 登录校验

    • 思路

  • 开发

  • package com.testpeople.interceptor;
    
    import com.alibaba.fastjson.JSONObject;
    import com.testpeople.pojo.Result;
    import com.testpeople.utils.JwtUtils;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.stereotype.Component;
    import org.springframework.util.StringUtils;
    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    @Slf4j
    @Component
    public class LoginCheckInterceptor implements HandlerInterceptor {
    
    
        @Override//目标方法资源运行前运行,返回值为true表示放行,false表示拦截
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            System.out.println("preHandle");
    
            //1.获取请求url
    
            String url = request.getRequestURI();
            log.info("interceptor_请求的url:{}",url);
            //2.判断是否是登录操作
    //          前面已经排除/login了
    //        if (url.contains("login")){
    //            log.info("interceptor_此请求为登录,放行");
    //            return true;
    //        }
    
            //3.获取请求头中的token
            String twj = request.getHeader("token");
    
            //4.判断令牌是否存在,若不存在,返回错误(未登录)
    
            if (!StringUtils.hasLength(twj)){
                log.info("interceptor_请求头中token为空,返回错误(未登录)");
                Result error = Result.error("NOT_LOGIN");
                //手动转换将对象转换成json————————阿里巴巴工具包fastjson
                String notLogin = JSONObject.toJSONString(error);
                response.getWriter().write(notLogin);
                return false;
            }
    
    
            //5.解析令牌,若解析失败,返回错误(未登录)
    
            try {
                JwtUtils.parseJwt(twj);
            } catch (Exception e) {//解析失败
                e.printStackTrace();
                log.info("令牌解析失败,返回错误(未登录)");
                Result error = Result.error("NOT_LOGIN");
                //手动转换将对象转换成json————————阿里巴巴工具包fastjson
                String notLogin = JSONObject.toJSONString(error);
                response.getWriter().write(notLogin);
                return false;
            }
    
            //6.放行
            log.info("令牌合法,放行");
            return true;
        }
    
        @Override//目标方法资源运行后运行
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            System.out.println("postHandle");
        }
    
        @Override//视图渲染后运行,最后运行
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            System.out.println("afterCompletion");
        }
    
    
    }
    
  • 测试

    • Postman

  • 后端显示正常

    • 登录功能没有被拦截,其他功能没有正确的token被拦截。

区别

异常处理

方案
  • 在所有的Controller中加入try..catch(不推荐)

  • 设置全局异常处理器(推荐)

  • package com.testpeople.exception;
    
    import com.testpeople.pojo.Result;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.web.bind.annotation.ExceptionHandler;
    import org.springframework.web.bind.annotation.RestControllerAdvice;
    
    /**
     * 全局异常处理类
     */
    @Slf4j
    @RestControllerAdvice
    public class GloablExceptionHandler {
    
        //捕获异常并返回
        @ExceptionHandler(Exception.class)//捕获所有异常(类型)
        public Result handleException(Exception e) {//捕获异常
            log.info("捕获异常:{}", e.getMessage());
            e.printStackTrace();//堆栈信息
            return Result.error("出现错误,请联系管理员");
        }
    
    
    }
  • 测试


拦截器和过滤器介绍完毕,也简单实现了异常的拦截

以上只是来自黑马程序员的课程,笔记为小编学习的笔记

项目地址

黑马程序员项目

标签:拦截器,com,捕获,springframework,org,过滤器,import,servlet,public
From: https://blog.csdn.net/m0_61801450/article/details/140499205

相关文章

  • 初始python异常捕获
    1、打开文件#打开文件的两种方式f=open("文件名/文件路径","要进行的操作",encoding="utf-8")#其中utf-8可以省略不写withopen("文件名/文件路径","要进行的操作",encoding="utf-8")asf:#这两种的区别,第一种需要进行手动关闭文件,里面没有内置关闭f.close第二种内置关闭,......
  • sqldumper.exe 是 SQL Server 的一个重要组件,专门用于捕获和处理关键错误,帮助管理员和
     sqldumper.exe的起源可以追溯到MicrosoftSQLServer的开发和运行时管理中。它作为SQLServer的一部分,主要用于处理数据库引擎遇到的关键错误和异常情况。具体来说,sqldumper.exe主要功能包括:异常处理和故障捕获:当SQLServer数据库引擎遇到严重错误时,如内存访问错误......
  • SpringMVC-拦截器
    文章目录1、拦截器的配置2、拦截器的三个抽象方法3、多个拦截器的执行顺序SpringMVC中的拦截器(Interceptor)是一种强大的机制,用于拦截请求和响应。它允许开发者在请求处理的不同阶段执行预处理和后处理操作,比如日志记录、权限检查、国际化等。以下是关于Sprin......
  • 过滤器和拦截器以及监听器
    过滤器(Filter)1过滤器是Web应用中的一个组件,它能够对客户端和服务器之间的请求(Request)和响应(Response)进行拦截和处理2过滤器基于函数回调机制,依赖于Servlet容器3过滤器可以对几乎所有的请求起作用,可以在请求到达Servlet之前或响应发送给客户端之后对请求和响应进行加工处理......
  • 【云原生】ptcpdump捕获任何进程、容器或 Pod 的网络流量的抓包神器——筑梦之路
    ptcpdump是一个使用eBPF技术开发的、类tcpdump的网络抓包工具。它除了兼容tcpdump的常用命令行参数以及包过滤语法外,还额外提供了如下核心特性:在输出中记录和显示发送网络流量的进程、容器、Pod信息。支持对指定进程、容器以及Pod进行抓包。支持将抓取的数据......
  • Spring MVC 中的拦截器的使用“拦截器基本配置” 和 “拦截器高级配置”
    1.SpringMVC中的拦截器的使用“拦截器基本配置”和“拦截器高级配置”@目录1.SpringMVC中的拦截器的使用“拦截器基本配置”和“拦截器高级配置”2.拦截器3.SpringMVC中的拦截器的创建和基本配置3.1定义拦截3.2拦截器基本配置3.3拦截器的高级配置4.SpringMVC......
  • 自定义拦截器
    第一步:创建的first类去实现 HandlerInterceptor  按需重写里面的  preHandle(预处理)、postHandle(执行前也叫前置拦截器)、afterCompletion(渲染之后执行任务之前)方法第二步:创建好first类不代表拦截器生效了要去写个配置类去配置它。创建second类去实现WebM......
  • Linux中使用Docker安装Redis容器以及布隆过滤器
    前言在项目中,一般普遍都会用到Redis,在准备学习Redis的相关的东西时,其中提到了缓存穿透、缓存击穿、缓存雪崩的问题。其中对于缓存穿透的一个解决方案中就有提到布隆过滤器,而布隆过滤器的也有许多提供方式(Guava、Redisson、RedisBloom),前面都是基于本地的,所以就选择了Redis官方......
  • abp框架必须移除的过滤器
    AbpExceptionFilter这个是abp默认异常处理过滤器,当我们需要统一返回结构时,需要移除AbpAutoValidateAntiforgeryTokenAttribute这个是abp身份验证过滤,当我们需要自定义jwt时需要移除移除代码示例:Configure<MvcOptions>(options=>{List<int>indexes=[];in......
  • gRPC 高级——Interceptor 拦截器
    gRPC拦截器是一种用于在RPC方法调用的生命周期中拦截和处理请求和响应的机制。拦截器允许开发者在请求到达实际服务方法之前或在响应返回客户端之前执行自定义逻辑。它们类似于中间件,广泛应用于日志记录、身份验证、请求修改等场景。拦截器的种类客户端拦截器(ClientInter......