Filter快速入门 Java web

文章目录

Filter 快速入门

  1. 定义Filter :定义一个类,是实现Filter 接口,并重写所有方法
  2. 配置Filter: Filter 类上加上 == @WebFilter == 注解,配置拦截资源的路径。引导类加上 == @ServletComponentScan == 开启Servlet 组件支持(也就是在spring boot 的启动类上面加上这个注释)
  3. 相关代码
java 复制代码
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;

@Slf4j
@WebFilter(urlPatterns = "/*")//表示所有路径
public class DemoFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {//初始化方法,web服务器启动,创建Filter时,调用,只是调用一次
       Filter.super.init(filterConfig);
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)           throws IOException, javax.servlet.ServletException {//拦截到请求时候,调用该方法,可调用多次
        // 在此处记录请求信息 

        // 继续执行过滤器链
        chain.doFilter(request, response);
 
    }

    @Override
    public void destroy() {//关闭服务器时候调用,只是调用一次/摧毁方法
          Filter.super.init(filterConfig);
    }
}  

登录演示

java 复制代码
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;

@Slf4j
@WebFilter(urlPatterns = "/*")//表示所有路径
public class DemoFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)           throws IOException, javax.servlet.ServletException {
		HttpServletRequest req = (HttpServletRequest) request;
		HttpServletResponse resp = (HttpServletResponse) Response;
		// 1. 获取请求URL
		String url = req.getRequestURL().toString();
		log.info("请求的url",url);

		//2.判断请求url中是否含有login,如果包含,就说明是登录操作,放行
		if(url.contains("login")){//这边建议与登录路径完全一致
		log.info("登录放行");
			  chain.doFilter(request, response);
			  return;
		}
		//3.获取请求头中的令牌(token)
		String jwt= req.getHeader("token");
		//4.判断令牌是否存在,如果不存在,返回错误结果(未登录)
		if(StringUtils.hasLength(jwt)){//看看hutool工具包,如果找不到该方法
			log.info("请求头token为空,未返回登录的信息")
			Result error = Result.error("NOT_LOGIN");
			//手动转换 对象 --> json  ---------> 使用阿里巴巴fast.json()
			String notLogin = JSONObject.toJSONString(error);
			resp.getWriter().write(notLogin);//返回字符串
			return;
		}
		//5.解析token。如果解析失败,返回错误结果(未登录)
		try{
			JwtUtils.parseJWT(jwt);//报错就说明解析失败,jwt有改动,或者时间过期了,未报错,说明解析成功
		}catch(Exception e){
			e.printStackTrace();
			log.info("解析令牌失败,返回错误信息");
			log.info("请求头token为空,未返回登录的信息")
			Result error = Result.error("NOT_LOGIN");
			//手动转换 对象 --> json  ---------> 使用阿里巴巴fast.json()
			String notLogin = JSONObject.toJSONString(error);
			resp.getWriter().write(notLogin);//返回字符串
			return;
		
		}
		//6.放行
        chain.doFilter(request, response);
 
    } 
}  
相关推荐
A_ugust__1 小时前
vue3+ts 封装跟随弹框组件,支持多种模式【多选,分组,tab等】
前端·javascript·vue.js
林九生1 小时前
【Vue3】v-dialog 中使用 execCommand(‘copy‘) 复制文本失效的原因与解决方案
前端·javascript·vue.js
yi碗汤园1 小时前
【一文了解】C#的StringSplitOptions枚举
开发语言·前端·c#
帧栈2 小时前
开发避坑指南(58):Java Stream 按List元素属性分组实战指南
java
Da Da 泓2 小时前
LinkedList模拟实现
java·开发语言·数据结构·学习·算法
海琴烟Sunshine2 小时前
Leetcode 14. 最长公共前缀
java·服务器·leetcode
cxr8282 小时前
BMAD框架实践:掌握story-checklist提升用户故事质量
前端·人工智能·agi·智能体·ai赋能
城管不管3 小时前
Lambda
java
emma羊羊3 小时前
【xsslabs】第12-19关
前端·javascript·靶场·xss
龙茶清欢3 小时前
5、urbane-commerce 微服务统一依赖版本管理规范
java·运维·微服务