SpringBoot拦截器-过滤器-监听器

x33g5p2x  于2021-09-25 转载在 Spring  
字(4.9k)|赞(0)|评价(0)|浏览(410)

过滤器应用场景

过滤器可以简单理解为“取你所想取”,忽视掉那些你不想要的东西;

1)过滤敏感词汇(防止sql注入)

2)设置字符编码

3)URL级别的权限访问控制

4)压缩响应信息

拦截器使用场景

拦截器可以简单理解为“拒你所想拒” 关心你想要拒绝掉哪些东西,比如一个BBS论坛上拦截掉敏感词汇。

拦截器本质上是面向切面编程(AOP),符合横切关注点的功能都可以放在拦截器中来实现,主要的应用场景包括:

  • 登录验证,判断用户是否登录。
  • 权限验证,判断用户是否有权限访问资源,如校验token
  • 日志记录,记录请求操作日志(用户ip,访问时间等),以便统计请求访问量。
  • 处理cookie、本地化、国际化、主题等。
  • 性能监控,监控请求处理时长等。
  • 通用行为:读取cookie得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有如提取Locale、Theme信息等,只要是多个处理器都需要的即可使用拦截器实现)

监听器应用场景

监听器:listener是servlet规范中定义的一种特殊类。用于监听servletContext、HttpSession和servletRequest等域对象的创建和销毁事件。监听域对象的属性发生修改的事件。

用于在事件发生前、发生后做一些必要的处理。其主要可用于以下方面:

1、统计在线人数和在线用户

2、系统启动时加载初始化信息

3、统计网站访问量

4、记录用户访问路径

创建过滤器

// /* 过滤全部请求 urlPatterns 可以使用{"",""}指定过滤
@WebFilter(urlPatterns = "/*",filterName = "filter1")
public class FilterDemo1 implements Filter {  //可以创建多个过滤器

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("过滤器1开始初始化");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("过滤器1开始工作");
        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void destroy() {
        System.out.println("过滤器1销毁");
    }

}

然后在启动类上加上 @ServletComponentScan 注解就会自动注册到容器里

创建拦截器(常用)

// 拦截器 可以定义多个
public class InterceptorDemo1 extends HandlerInterceptorAdapter {

    
     //预处理 ,controller方法执行前执行
    //如果 return false 那么就不会执行后面的方法 包括将要执行的控制器的方法
    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
        StringBuffer requestURL = httpServletRequest.getRequestURL();
        System.out.println("前置拦截器1 preHandle: 请求的uri为:"+requestURL.toString());

        return true; 
    }
    // 后处理
    // 当执行完controller方法 还有没 return前执行
    //切记如果预处理返回值为false 后处理就不会执行
    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
        System.out.println("拦截器1 postHandle: ");
    }
    // 最终处理
    // 执行完controller方法后 并且return后 才会执行
    // 如果预处理 retrun fasle; 最终处理 就不会执行了
    // 但是这个无法跳转页面了 因为都执行完了 还跳个屁啊 一般都用于资源释放
    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
        System.out.println("拦截器1 afterCompletion: ");
    }

}

注册拦截器

@Configuration
public class InterceptorConfiguration implements WebMvcConfigurer {

    /** * 注册自定义拦截器 */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // /** 代表拦截所有请求 执行顺序和配置顺序有关系,即先配置顺序就在前
        
        // 添加拦截器
        new InterceptorDemo1();
        registry.addInterceptor(new  InterceptorDemo1() )
// 定义拦截路径
                .addPathPatterns("/**")
// 定义放行路径
                .excludePathPatterns("/index/**");
}

拦截器中的handler参数使用

//必须Controller请求 
    if(handler.getClass().isAssignableFrom(HandlerMethod.class)){
        HandlerMethod handlerMethod = (HandlerMethod) handler;
        System.out.println("当前拦截的方法为:"+handlerMethod.getMethod().getName());
        System.out.println("当前拦截的方法参数长度为:"+handlerMethod.getMethod().getParameters().length);
        System.out.println("当前拦截的类为:"+handlerMethod.getBean().getClass().getName());
        String uri = request.getRequestURI();
        System.out.println("拦截的uri:"+uri);
        }

创建监听器

常用监听器有三种

//应用启动监听
@WebListener
public class ServletContextListenerDemo implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        ServletContext servletContext = sce.getServletContext();

        System.out.println("ServletContextListenerDemo监听器初始化。。。。。。。。。。。。");
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {

        System.out.println("ServletContextListenerDemo监听器销毁。。。。。。。。。。。");
    }

}
//请求监听
@WebListener
public class ServletRequestListenerDemo  implements ServletRequestListener {
    @Override
    public void requestDestroyed(ServletRequestEvent sre) {
        ServletRequest servletRequest = sre.getServletRequest();
        System.out.println("ServletRequestListenerDemo监听器初始化。。。。。。。。。。。。");
    }

    @Override
    public void requestInitialized(ServletRequestEvent sre) {
        System.out.println("ServletRequestListenerDemo监听器销毁。。。。。。。。。。。");
    }
}
//监听session监听器
@WebListener
public class SessionListenerDemo  implements HttpSessionListener {

    @Override
    public void sessionCreated(HttpSessionEvent se) {
        HttpSession session = se.getSession();
        System.out.println("SessionListenerDemo。。。创建session成功");
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        System.out.println("SessionListenerDemo。。。销毁session");
    }

}

然后在启动类上加上 @ServletComponentScan 注解就会自动注册到容器里

ssionListenerDemo。。。创建session成功");
}

@Override
public void sessionDestroyed(HttpSessionEvent se) {
    System.out.println("SessionListenerDemo。。。销毁session");
}

}

然后在启动类上加上 @ServletComponentScan 注解就会自动注册到容器里


更深层次的用法需要根据业务来定,自己进行设计


<center><font color=#FF3366 size=5 >点赞 -收藏-关注-便于以后复习和收到最新内容</font></center>

<center> <font color=#FF3366 size=4 >有其他问题在评论区讨论-或者私信我-收到会在第一时间回复</font></center>

<center><font color=#FF3366 size=6 >如有侵权,请私信联系我</font></center>

<center> <font color=#FF3366 size=6 >感谢,配合,希望我的努力对你有帮助^_^ </font></center>

相关文章