JavaWeb(SpringBoot3+vue3)开发+教学管理系统项目实战之过滤器Filter
- 第1步,定义过滤器 :1.定义一个类,实现 Filter 接口,并重写其所有方法。
- 第2步,配置过滤器:Filter类上加 @WebFilter 注解,配置拦截资源的路径。引导类上加 @ServletComponentScan 开启Servlet组件支持。
- @WebFilter(urlPatterns = "/*") //配置过滤器要拦截的请求路径( /* 表示拦截浏览器的所有请求 )
- public class DemoFilter implements Filter {
- //初始化方法, web服务器启动, 创建Filter实例时调用, 只调用一次
- public void init(FilterConfig filterConfig) throws ServletException {
- System.out.println("init ...");
- }
-
- //拦截到请求时,调用该方法,可以调用多次
- public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {
- System.out.println("拦截到了请求...");
- }
-
- //销毁方法, web服务器关闭时调用, 只调用一次
- public void destroy() {
- System.out.println("destroy ... ");
- }
- }
复制代码 当我们在Filter类上面加了@WebFilter注解之后,接下来我们还需要在启动类上面加上一个注解@ServletComponentScan,通过这个@ServletComponentScan注解来开启SpringBoot项目对于Servlet组件的支持。
- package com.zidiu;
-
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
- import org.springframework.boot.web.servlet.ServletComponentScan;
-
- @ServletComponentScan //开启对Servlet组件的支持
- @SpringBootApplication
- public class DemoApplication {
-
- public static void main(String[] args) {
- SpringApplication.run(DemoApplication.class, args);
- }
-
- }
复制代码
- init方法:过滤器的初始化方法。在web服务器启动的时候会自动的创建Filter过滤器对象,在创建过滤器对象的时候会自动调用init初始化方法,这个方法只会被调用一次。
- doFilter方法:这个方法是在每一次拦截到请求之后都会被调用,所以这个方法是会被调用多次的,每拦截到一次请求就会调用一次doFilter()方法。
- destroy方法: 是销毁的方法。当我们关闭服务器的时候,它会自动的调用销毁方法destroy,而这个销毁方法也只会被调用一次。
注意事项:在过滤器Filter中,如果不执行放行操作,将无法访问后面的资源。 放行操作:chain.doFilter(request, response);
过滤器封装工具:
- package com.zidiu.utils;
-
- 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.apache.http.HttpStatus;
- import org.springframework.util.StringUtils;
- import java.io.IOException;
-
- /**
- * 令牌校验过滤器
- */
- @Slf4j
- @WebFilter(urlPatterns = "/*")
- public class TokenFilter implements Filter {
-
- @Override
- public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
- HttpServletRequest request = (HttpServletRequest) req;
- HttpServletResponse response = (HttpServletResponse) resp;
- //1. 获取请求url。
- String url = request.getRequestURL().toString();
-
- //2. 判断请求url中是否包含login,如果包含,说明是登录操作,放行。
- if(url.contains("login")){ //登录请求
- log.info("登录请求 , 直接放行");
- chain.doFilter(request, response);
- return;
- }
-
- //3. 获取请求头中的令牌(token)。
- String jwt = request.getHeader("token");
-
- //4. 判断令牌是否存在,如果不存在,返回错误结果(未登录)。
- if(!StringUtils.hasLength(jwt)){ //jwt为空
- log.info("获取到jwt令牌为空, 返回错误结果");
- response.setStatus(HttpStatus.SC_UNAUTHORIZED);
- return;
- }
-
- //5. 解析token,如果解析失败,返回错误结果(未登录)。
- try {
- JwtUtils.parseJWT(jwt);
- } catch (Exception e) {
- e.printStackTrace();
- log.info("解析令牌失败, 返回错误结果");
- response.setStatus(HttpStatus.SC_UNAUTHORIZED);
- return;
- }
-
- //6. 放行。
- log.info("令牌合法, 放行");
- chain.doFilter(request , response);
- }
-
- }
复制代码 SpringBoot3+Vue3开发综合实战项目:
JavaWeb(SpringBoot3+vue3)开发+教学管理系统项目实战 |