JWT令牌验证,Filter过滤器和Interceptor拦截器

一、JWT令牌

1.JWT令牌简述

JWT(JSON Web Token)是一种开放标准,主要用于在网络上安全的传输信息.
其实就是一串字符串
JWT令牌由三部分组成:头(Header)、载荷(Payload)、签名(Signature),用(.分隔)
格式为:

头.载荷.签名
Header.Payload.Signature
xxxxx.yyyyyy.zzzzz

2.JWT组成结构

2.1 头部(Header)*

记录令牌类型,签名算法等.

令牌类型(typ):JWT
签名算法(alg):如HMAC SHA256或RSA

例如:

{
    "typ":"JWT"
    "alg":"HS256"
}

2.2 载荷(Payload)

携带一些自定义信息,默认信息等.

注册声明(Registered claims):预定义的声明,如iss(签发者),exp(过期时间),sub(主题)等
公开声明(Public claima)
私有声明(private claims)

例如

{
    "id":"1"
    "username":"zhangsan"
    "emmm":"emmm"
}

2.3 签名(Signature)

防止ToKen被篡改,确保安全性.将 头header,载荷payload 并加入指定秘钥,通过指定签名算法计算而来

编码后的header
编码欧的payload
秘钥
header中指定的算法

HMAC SHA256

HMACSHA256(
    base64UrlEncode(header)+"."+
    base64UrlEncode(payload),
    secret)

3.工作流程

  1. 用户使用凭据(账号密码)登录
  2. 服务器验证通过后,创建JWT令牌(一串字符串)并返回
  3. 客户端保存JWT令牌(通常在localStorage或Cookie中)
  4. 服务器验证JWT并响应请求

4.代码实际应用

4.1 依赖导入

<dependency>
	<groupId>io.jsonwebtoken</groupId>
	<artifactId>jjwt</artifactId>
	<version>0.9.1</version>
</dependency>

4.2 代码实样

创建JWT令牌

//创建构建JWT令牌方法
public void testGenJwt() {
    //自定义内容,用以构建载荷
    Map<String, Object> claims = new HashMap<>();
    //填充数据
    claims.put("id", 10);
    claims.put("username", "itheima");

    //构建JWT令牌
    String jwt = Jwts.builder()
	//头,前面 SignatureAlgorithm.H256 是算法,后面"xxxxx"是秘钥,可自定义
	.signWith(SignatureAlgorithm.HS256, "xxxxx")
	//构建载荷,把上面自定义的内容填充进去,用以构建载荷内容
	.addClaims(claims)
	//签名,括号内是令牌生效截止时间,签名的Date是当前时间,
	//后面是计算应该加的时间,从而得到令牌有效的截止时间
	.setExpiration(new Date(System.currentTimeMillis() + 12 * 3600 * 1000))
	//收尾
	.compact();
}

解析令牌

//创建令牌解析方法
public void testParseJwt() {
	//解析令牌,claims为解析后的结果
	Claims claims = Jwts.parser().setSigningKey("aXRjYXN0")
		//传入JWT令牌
		.parseClaimsJws("令牌")
		.getBody();
}

一般来说,在响应前端服务器后,会在请求头中携带令牌给前端,请求头名为token,可以通过开发者工具在请求头中看到对应的令牌数据

Filter过滤器

1.Filter简述

  • Filter表示过滤器,是JavaWeb三大组件之一(Servlet,Filter,Listener)
  • 过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能
    • 使用了过滤器之后,要想访问Web服务器上的资源,必须先经过过滤器,过滤器处理完毕之后,才可以访问对应的资源
  • 过滤器一般完成一些通用的操作,比如:登录校验,编码处理,敏感字符处理等

2.Filter工作原理

  1. 客户端发送请求->Filter拦截
  2. Filter决定是否放行(chain.doFilter())
  3. Filter处理后->返回给客户端

3.代码实样

创建工具类实现Filter接口,并使用@WebFilter注解

//括号里表示拦截路径,/*表示拦截全部
@WebFilter("/*")
public class DemoFilter implements Filter {

    //初始化方法, web服务器启动, 创建Filter实例时调用, 只调用一次
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("初始化");
    }

    //拦截到请求时,调用该方法,可以调用多次
    @override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {
        System.out.println("拦截请求");
    }

    //销毁方法, web服务器关闭时调用, 只调用一次
    @Override
    public void destroy() {
        System.out.println("destroy ... ");
    }
}

在Filter类上面加了@WebFilter注解之后,还需要在启动类上面加上一个注解@ServletComponentScan,通过该注解来开启SpringBoot项目对于Servlet组
件的支持

注:如果有多个Filter类,执行顺序取决于类名如(AFilter->BFilter)

4.拦截路径

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

Interceptor拦截器

1.简述

  • 是一种动态拦截方法调用的机制,类似于过滤器
  • 拦截器是Spring框架中提供的,用来动态拦截控制器方法的执行
  • 拦截器的作用:拦截请求,在指定方法调用前后,根据业务需要执行预先设定的代码

2.拦截器的使用

2.1 自定义拦截器

实现HendlerInterceptor接口,并重写其所有方法

//自定义拦截器
@Component
public class DemoInterceptor implements HandlerInterceptor {
    //目标资源方法执行前执行。 返回true:放行    返回false:不放行
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle .... ");
        
        return true; //true表示放行
    }

    //目标资源方法执行后执行
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle ... ");
    }

    //视图渲染完毕后执行,最后执行
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion .... ");
    }
}

2.2注册拦截器

创建一个配置类,实现WebMvcConfigurer接口,并重写addInterceptors方法

@Configuration  
public class WebConfig implements WebMvcConfigurer {

    //自定义的拦截器对象
    @Autowired
    private DemoInterceptor demoInterceptor;

    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
       //注册自定义拦截器对象
        registry.addInterceptor(demoInterceptor).addPathPatterns("/**");//设置拦截器拦截的请求路径( /** 表示拦截所有请求)
    }
}

3.拦截路径

拦截路径 含义 举例
/* 一级路径 可匹配/x, /y, /z ,不可匹配/x/z
/** 任意级路径 能匹配全部路径
/x/* /x下的一级路径 能匹配/x/z, /x/c,...不能匹配/x/c/*
/x/** /x下的任意级路径 能匹配/x, /x/* ,/x/c/*

示例

@Configuration  
public class WebConfig implements WebMvcConfigurer {

    //拦截器对象
    @Autowired
    private DemoInterceptor demoInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //注册自定义拦截器对象
        registry.addInterceptor(demoInterceptor)
		//设置拦截器拦截的请求路径( /** 表示拦截所有请求)
                .addPathPatterns("/**")
		//设置不拦截的请求路径
                .excludePathPatterns("/login");
    }
}

posted on 2025-07-17 23:31  上官徵羽  阅读(104)  评论(0)    收藏  举报

导航