过滤器(Filter)

概述

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

Filter的使用:

  1. 定义Filter:定义一个类,实现 Filter 接口,并重写其所有方法
  2. 配置Filter:在 Filter 类上加@WebFilter注解,配置拦截资源的路径。由于Filter属于Servlet三大组件之一,故需在引导类上加@ServletComponentScan开启Servlet组件支持

代码实现

FIlter类:

@WebFilter(urlPatterns = "/*")
public class DemoFilter implements Filter{
	 //初始化方法,Web服务器启动,创建Filter时调用,只调用一次
	public void init(FilterConfig filterConfig) throws ServletException{
		Filter.super.init(filterConfig);
	}
	//拦截到请求时,调用该方法,可调用多次
	public void doFilter(ServletRequest request,ServletResponce responce,FilterChain chain){
		chain.doFilter(request,responce);
	}
	//销毁方法,服务器关闭时调用,只调用一次
	public void destory(){
		Filter.super.destory();
	}
}

引导类:

@ServletComponentScan
@SpringBootApplication
public class TliasWebManagementApplication{
	public static void main(String[] args){
		SpringApplication.run(TliasWebManagementApplication.class, args);
	}
}

过滤器执行流程

在这里插入图片描述

过滤器拦截路径

FIlter可以根据需求,配置不同的拦截资源路径:

拦截路径urlPatterns值含义
拦截具体路径/login只有访问 /login 路径时,才会被拦截
目录拦截/emps/*访问/emps下的所有资源,都会被拦截
拦截所有/*访问所有资源,都会被拦截

过滤器链

介绍 : 一个web应用中,可以配置多个过滤器,这多个过滤器就形成了一个过滤器链
顺序 : 注解配置的Filter,优先级是按照过滤器类名(字符串)的自然排序

登录校验实现

登录校验 Filter 流程

在这里插入图片描述

public class LoginCheckFilter implements Filter{
	@Override
	public void doFilter(ServlectRequest request,ServletResponse response,FilterChain chain) throws IOException...{
		HttpServlectRequest req = (HttpServlectRequest) request;
		HttpServlectResponse resp = (HttpServlectResponse) response;
		//1.获取请求url。
		String url = req.getResquestURL().toString();
		//2.判断请求url中是否包含login,如果包含,说明是登陆操作,则放行
		if (url.contains("login")){
			chain.doFilter(request,response);
			return;
		}
		//3.获取请求头中的令牌(token)
		String jwt = req.getHeader("token");
		//4.判断令牌是否存在,如果不存在,则返回错误结果(未登录)
		if(!StringUtils.hasLength(jwt)){
			Result error = Result.error(""NOT_LOGIN);
			String notLogin = JSONObject.toJSONString(error);
			resp.getWriter().write(notLogin);
			return;
		}
		//5.解析令牌token,如果解析失败,返回错误结果(未登录)
		try{
			JWTUtils.parseJWT(jwt);	
		} catch (Exception e){	//JWT解析失败
			e.printStackTrace();
			Result error = Result.error(""NOT_LOGIN);
			String notLogin = JSONObject.toJSONString(error);
			resp.getWriter().write(notLogin);
			return;
		}
		//6.放行
		chain.doFilter(request,response);
	}
}
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值