当前位置: 代码网 > it编程>编程语言>Java > springboot实现过滤器的示例代码

springboot实现过滤器的示例代码

2024年10月25日 Java 我要评论
一 过滤器介绍1.1 过滤器概念过滤器,即filter,它是javaweb三大组件之一(servlet程序、listener监听器、filter过滤器)作用:既可以对请求进行拦截,也可以对响应进行处理

一 过滤器介绍

1.1 过滤器概念

过滤器,即filter,它是javaweb三大组件之一(servlet程序、listener监听器、filter过滤器)

作用:既可以对请求进行拦截,也可以对响应进行处理。常用于做权限检查,记录日志操作、拦截过滤请求、对请求字符设置编码等。

1.2 过滤器生命周期

springboot定义一个过滤器很简单,只需要实现filter类,然后重写它的3个方法即可。

  • init方法:程序启动调用filter的init()方法,永远只调用一次;在容器中创建当前过滤器的时候自动调用这个方法。
  • destory方法:程序停止调用filter的destroy()方法,永远只调用一次;在容器中销毁当前过滤器的时候自动调用这个方法。
  • dofilter方法:每次的访问请求如果符合拦截条件都会调用dofilter()方法,程序第一次运行,会在servlet调用init()方法以后调用dofilter()方法;不管第几次请求,都是在调用servlet的doget(),dopost()方法之前调用。这个方法有3个参数,分别是servletrequest、servletresponse和filterchain,可以从这些参数中获取httpservletreguest和httpservletresponse对象进行相应的处理操作。

二 springboot中过滤器的两种实现方式

2.1 注解方式实现过滤器

首先需要在启动类加 @servletcomponentscan 注解,启动类如下

import org.mybatis.spring.annotation.mapperscan;
import org.springframework.boot.springapplication;
import org.springframework.boot.autoconfigure.springbootapplication;
import org.springframework.boot.web.servlet.servletcomponentscan;

@springbootapplication
@mapperscan("com.ts.myt.dao")
@servletcomponentscan // 过滤器
public class mytapplication {
    public static void main(string[] args) {
        springapplication.run(mytapplication.class, args);
    }
}

编写过滤器,实现filter接口

import com.alibaba.fastjson.jsonobject;
import org.slf4j.logger;
import org.slf4j.loggerfactory;
import javax.servlet.*;
import javax.servlet.annotation.webfilter;
import javax.servlet.http.httpservletrequest;
import java.io.ioexception;
import java.io.printwriter;

/**
 * @author:sgw
 * @date:2023/9/15
 * @description: 使用注解方式实现过滤器(@webfilter)
 */
@webfilter(urlpatterns = "/user/*", filtername = "filter1")
public class myfilter implements filter {
    private static final logger logger = loggerfactory.getlogger(myfilter.class);

    @override
    public void init(filterconfig filterconfig) throws servletexception {
//        filter.super.init(filterconfig);
        logger.info("myfilterinit1");
    }

    @override
    public void dofilter(servletrequest servletrequest, servletresponse servletresponse, filterchain filterchain) throws ioexception, servletexception, ioexception {
        logger.info("dofilter");
        httpservletrequest request = (httpservletrequest) servletrequest;
        string token = request.getheader("token");
        logger.info("token值:{}", token);

        if (token != null) {
            //该方法执行后直接运行至下一个过滤器
            filterchain.dofilter(servletrequest, servletresponse);
        } else {
            servletresponse.setcharacterencoding("utf-8");
            servletresponse.setcontenttype("application/json; charset=utf-8");
            printwriter out = servletresponse.getwriter();
            jsonobject res = new jsonobject();
            res.put("msg", "错误");
            res.put("success", "false");
            out.append(res.tostring());
        }
    }

    @override
    public void destroy() {
//        filter.super.destroy();
        logger.info("destroy");
    }
}

上边对请求头header做了过滤,即请求头里必须含有key为token的值,才能继续访问具体接口,否则该请求就终止访问接口了

2.2 非注解方式实现过滤器(直接注入到spring中)

定义过滤器,同样实现filter接口

import com.alibaba.fastjson.jsonobject;
import org.slf4j.logger;
import org.slf4j.loggerfactory;
import javax.servlet.*;
import javax.servlet.http.httpservletrequest;
import java.io.ioexception;
import java.io.printwriter;

/**
 * @author:sgw
 * @date:2023/9/15
 * @description: 过滤器实现方式二:使用非注解方式实现过滤器(直接注入到spring中)
 */
public class myfilter2 implements filter {
    private static final logger logger = loggerfactory.getlogger(myfilter2.class);
    @override
    public void init(filterconfig filterconfig) throws servletexception {
        logger.info("myfilterinit2");
    }

    @override
    public void dofilter(servletrequest servletrequest, servletresponse servletresponse, filterchain filterchain) throws ioexception, servletexception, ioexception {
        system.out.println("dofilter");
        httpservletrequest request = (httpservletrequest) servletrequest;
        string token = request.getheader("token");
        system.out.println(token);
        //该方法执行后直接运行至下一个过滤器
        if(token!=null){
            filterchain.dofilter(servletrequest, servletresponse);
        }else{
            servletresponse.setcharacterencoding("utf-8");
            servletresponse.setcontenttype("application/json; charset=utf-8");
            printwriter out = servletresponse.getwriter();
            jsonobject res = new jsonobject();
            res.put("msg", "错误");
            res.put("success", "false");
            out.append(res.tostring());
        }
    }

    @override
    public void destroy() {
        system.out.println("destroy");
    }
}

编写过滤器配置类

import com.ts.myt.filter.myfilter2;
import org.springframework.boot.web.servlet.filterregistrationbean;
import org.springframework.context.annotation.bean;
import org.springframework.context.annotation.configuration;
/**
 * @author:sgw
 * @date:2023/9/15
 * @description: 方式二的过滤器配置文件
 */
@configuration
public class myfilter2config {
    // filter代码类
    @bean
    public myfilter2 myfilter2() {
        return new myfilter2();
    }

    @bean
    public filterregistrationbean getfilterregistrationbean(myfilter2 myfilter2) {
        filterregistrationbean filterregistrationbean = new filterregistrationbean();
        filterregistrationbean.setfilter(myfilter2);
        filterregistrationbean.setorder(2);
        filterregistrationbean.addurlpatterns("/user/*");
        filterregistrationbean.setname("tokenfilter2");
        return filterregistrationbean;
    }
}

效果与方式一一样。

到此这篇关于springboot实现过滤器的示例代码的文章就介绍到这了,更多相关springboot 过滤器内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com