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.工作流程
- 用户使用凭据(账号密码)登录
- 服务器验证通过后,创建JWT令牌(一串字符串)并返回
- 客户端保存JWT令牌(通常在localStorage或Cookie中)
- 服务器验证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工作原理
- 客户端发送请求->Filter拦截
- Filter决定是否放行(
chain.doFilter()) - 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");
}
}
浙公网安备 33010602011771号