欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

小白的springboot之路(十三)、过滤器、监听器、拦截器

程序员文章站 2022-06-05 18:19:00
0、前言 过滤器、监听器、拦截器在实际开发中经常需要用到,下面我们来介绍一下spring boot中如何使用; 一、 过滤器 1、作用: 过滤器是客户端与服务器资源文件之间的一道过滤网,可以帮助我们过滤一些不符合要求的请求、可以对服务器的资源请求(如图片、文件等)进行拦截以实现一些特殊功能以及给予特 ......

0、前言

  过滤器、监听器、拦截器在实际开发中经常需要用到,下面我们来介绍一下spring boot中如何使用;

一、------ 过滤器 -----

1、作用:

  过滤器是客户端与服务器资源文件之间的一道过滤网,可以帮助我们过滤一些不符合要求的请求、可以对服务器的资源请求(如图片、文件等)进行拦截以实现一些特殊功能以及给予特殊响应;

  常用作session校验、判断用户权限、过滤敏感词汇、压缩响应信息、控制url级别访问权限等

2、实现:

  使用过滤器很简单,只需要实现filter类,重写他的三个方法即可:

init:过滤器创建时执行的方法;
destroy:过滤器销毁时执行的方法

dofilter:主方法,处理逻辑;里面有三个参数,可以通过他们获得请求的相关信息;


1)创建过滤器类 logfilter,添加@webfilter注解

package com.anson.common.filter;

import org.slf4j.logger;
import org.slf4j.loggerfactory;

import javax.servlet.*;
import javax.servlet.annotation.webfilter;
import javax.servlet.http.httpservletrequest;
import javax.servlet.http.httpservletresponse;
import javax.servlet.http.httpservletresponsewrapper;
import java.io.ioexception;

/**
 * @description: 过滤器
 * @author: anson
 * @date: 2019/12/20 6:03
 */

@webfilter(filtername = "logfilter1", urlpatterns = "/*")
public class logfilter implements filter
{
    private static final logger logger = loggerfactory.getlogger(logfilter.class);

    @override
    public void init(filterconfig filterconfig) throws servletexception
    {

        logger.info("----------------------->过滤器被创建");
    }

    @override
    public void dofilter(servletrequest servletrequest, servletresponse servletresponse, filterchain filterchain) throws ioexception, servletexception {

        httpservletrequest req = (httpservletrequest) servletrequest;
        httpservletresponsewrapper resp = new httpservletresponsewrapper((httpservletresponse) servletresponse);

        string requesturi = req.getrequesturi();
        logger.info("--------------------->过滤器:请求地址"+requesturi); //记录请求
        if(requesturi.contains("info")){
           // servletrequest.getrequestdispatcher("/failed").forward(servletrequest, servletresponse);
            resp.sendredirect("/failed");
        }else{
            filterchain.dofilter(servletrequest, servletresponse);
        }
    }

    @override
    public void destroy() {

        logger.info("----------------------->过滤器被销毁");
    }
}

2)在启动类上加入@servletcomponentscan注解

@servletcomponentscan("com.anson.common") //用于支持过滤器、监听器注解

即可

注意:我们以上采用的注解自动注册的方式,过滤器还可以采用代码注册的方式(略),自己选用一种即可;

二、----- 监听器 -----

1、作用:

  监听器用于监听web应用对象的创建、销毁、增加、修改、删除等动作的发生,并做出相应的响应处理;

  常用于统计在线人数、访问量、系统加载时信息初始化;

2、分类:

servletcontextlistener:对应application,用于监听servletcontex属性的操作;
httpsessionlistener: 对应session,用于监听session对象,常用于统计在线情况;
servletrequestlistener:对应request,监听request对象的属性操作;

3、实现:

1}创建监听器 onlinesessionlistener

package com.anson.common.listener;

import com.anson.common.exception.globalexceptionhandler;
import org.slf4j.logger;
import org.slf4j.loggerfactory;

import javax.servlet.servletcontextevent;
import javax.servlet.servletcontextlistener;
//import javax.servlet.servletrequestlistener;
import javax.servlet.annotation.weblistener;
//import javax.servlet.http.httpsessionevent;
//import javax.servlet.http.httpsessionlistener;

/**
 * @description: todo
 * @author: anson
 * @date: 2019/12/20 6:48
 */
@weblistener
public class onlinesessionlistener implements  servletcontextlistener  //httpsessionlistener
{
    private static final logger logger = loggerfactory.getlogger(onlinesessionlistener.class);

    @override
    public void contextinitialized(servletcontextevent servletcontextevent)
    {
        logger.info("系统启动了");
        system.out.println("系统启动了");
    }

    @override
    public void contextdestroyed(servletcontextevent servletcontextevent)
    {
        logger.info("系统停止了");
        system.out.println("系统停止了");
    }

    //=============================
//    public  static int online=0;
//
//    @override
//    public void sessioncreated(httpsessionevent httpsessionevent)
//    {
//
//        online ++;
//        logger.info("有用户上线了,当前在线人数:" + online);
//        system.out.println("有用户上线了,当前在线人数:" + online);
//    }
//
//    @override
//    public void sessiondestroyed(httpsessionevent httpsessionevent)
//    {
//        online --;
//        logger.info("有用户下线了,当前在线人数:" + online);
//        system.out.println("有用户下线了,当前在线人数:" + online);
//    }
}

2)在启动类上加入@servletcomponentscan注解

@servletcomponentscan("com.anson.common") //用于支持过滤器、监听器注解

即可

注意:我们以上采用的注解自动注册的方式,过滤器还可以采用代码注册的方式(略),自己选用一种即可;

 

三、 ------ 拦截器 ------

1、作用:

  拦截器是动态拦截action调用的对象,使得可以在action前后增加一些操作,也可以在action执行前停止操作;

  常用于登录认证、记录操作日志、通用处理等;

2、实现:

  使用过滤器很简单,只需要实现handlerinterceptor类,重写他的三个方法即可:

prehandle:处理请求之前被调用;
posthandle:请求执行完后调用;
aftercompletion:在dispatcharservlet完全处理请求后调用,常用于记录耗时时间,也可用于进行一些资源处理操作;

1)编写拦截器类myinterceptor
package com.anson.common.interceptor;

import com.anson.common.exception.globalexceptionhandler;
import org.slf4j.logger;
import org.slf4j.loggerfactory;
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;

/**
 * @description: 拦截器
 * @author: anson
 * @date: 2019/12/20 7:23
 */

@component
public class myinterceptor implements handlerinterceptor
{
    private static final logger logger = loggerfactory.getlogger(myinterceptor.class);

    public void aftercompletion(httpservletrequest arg0, httpservletresponse arg1, object arg2, exception arg3)
            throws exception
    {
        logger.info("aftercompletion被调用");
        long startime = (long) arg0.getattribute("startime");
        logger.info("请求耗时:"+ (system.currenttimemillis() - startime));
    }

    public void posthandle(httpservletrequest arg0, httpservletresponse arg1, object arg2, modelandview arg3)
            throws exception
    {
        logger.info("posthandle被调用");
    }

    public boolean prehandle(httpservletrequest request, httpservletresponse response, object arg2) throws exception {

        logger.info("prehandle被调用");
        request.setattribute("startime",system.currenttimemillis());
        return true;
    }
}

2)增加配置类appconfigurer,注册拦截器

package com.anson.config;

import com.anson.common.interceptor.myinterceptor;
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;

/**
 * @description: 配置类
 * @author: anson
 * @date: 2019/12/20 7:35
 */
@configuration
public class appconfigurer implements webmvcconfigurer
{
    @autowired
    private myinterceptor myinterceptor;

    //注册拦截器
    @override
    public void addinterceptors(interceptorregistry registry) {

        registry.addinterceptor(myinterceptor);
    }
}

即可

四、后记

  过滤器、拦截器、监听器的简单用法就是这样,包括后面要讲的aop,他们在有些功能上是交叉的,根据实际需要灵活选用即可;