过滤器Filter --学习笔记

什么是Filter?

  • Filter表示过滤器,是 JavaWeb三大组件(Servlet、Filter、Listener)之一
  • 过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能
  • 过滤器一般完成一些通用的操作,比如:登录校验、统一编码处理、敏感字符处理等

使用了过滤器之后,要想访问web服务器上的资源,必须先经过滤器,过滤器处理完毕之后,才可以访问对应的资源

FIlter的使用

示例程序:

package com.zeyu.filter;

import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;

import java.io.IOException;

@WebFilter(urlPatterns = "/*")  //指定拦截路径   *通配符,表所有
public class DemoFilter implements Filter { //要生效,必须在启动类打上注解@ServletComponentScan  开启对servlet组件的支持
                                            //一个Web应用中,可配置多个Filter过滤器,执行的优先级是按照过滤器类名(字符串)自然排序
    @Override   //初始化方法,只调用一次
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("init 初始化方法执行了");
    }

    @Override   //拦截到请求之后调用,调用多次
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("拦截到了请求");
        //放行
        filterChain.doFilter(servletRequest,servletResponse);   //servletRequest  请求对象   servletResponse  响应对象
    }

    @Override   //销毁方法,只调用一次
    public void destroy() {
        System.out.println("destroy 销毁方法执行了");
    }
}

如上述代码,要想Filter生效,要完成俩步配置

  • 在类名上添加@WebFilter(urlPatterns = "/*"),urlPatterns的值表示要拦截的路径,*表通配,所有
  • 在启动类上添加@ServletComponentScan注解,开启对servlet服务的支持

然后在doFilter中的filterChain.doFilter(放行方法)之前,编写需要的相应代码即可

比如要做登录验证,在此之前验证JWT令牌的真伪即可

登录验证示例:

package com.zeyu.filter;

import com.alibaba.fastjson.JSONObject;
import com.zeyu.pojo.Result;
import com.zeyu.utils.JwtUtils;
import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;

import java.io.IOException;

@Slf4j
@WebFilter(urlPatterns = "/*")
public class LoginCheckFilter implements Filter {   //过滤非login请求,检查jwt令牌

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //1、获取请求url
        HttpServletRequest req = (HttpServletRequest) servletRequest;
        HttpServletResponse res = (HttpServletResponse) servletResponse;
        String url = req.getRequestURL().toString();
        log.info("请求的url:{}",url);

        //2、判断请求url中是否包含login,如果包含,说明是登录操作,放行
        if(url.contains("login")){
            log.info("登录操作.....放行");
            filterChain.doFilter(servletRequest,servletResponse);
            return;
        }

        //3、获取请求头中的令牌(token)
        String jwt = req.getHeader("token");

        //4、判断令牌是否存在,如果不存在,返回错误结果(未登录)
        if(!StringUtils.hasLength(jwt)){    //判断字符串是否有长度,如果没有代表字符串为null或空串
            log.info("请求头token为空,返回未登录信息");
            Result error = Result.error("NOT_LOGIN");
            //手动将 对象 转换成 json格式转换回去
            String err = JSONObject.toJSONString(error);
            //通过servletResponse  对象  响应
            servletResponse.getWriter().write(err);
            return;
        }

        //5、解析token,如果解析失败,返回错误结果(未登录)
        try {
            JwtUtils.parseJWT(jwt);
        } catch (Exception e) { //出现异常说明jwt解析失败,反之成功
            e.printStackTrace();
            log.info("请求头token为空,返回未登录信息");
            Result error = Result.error("NOT_LOGIN");
            //手动将 对象 转换成 json格式转换回去
            String err = JSONObject.toJSONString(error);
            //通过servletResponse  对象  响应
            servletResponse.getWriter().write(err);
            return;
        }

        //6、放行
        log.info("令牌合法,放行");
        filterChain.doFilter(servletRequest,servletResponse);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

A泽予

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值