jwt令牌
全称:JSON Web Token
JWT(JSON Web Token)令牌是一种用于在网络应用程序间传递声明的安全方式,它可以包含用户的身份信息、权限信息等。以下是一个简单的例子来帮助你理解 JWT 令牌的用途:
假设你有一个在线商城应用,用户需要登录后才能进行购物、查看订单等操作。
用户登录:用户在登录页面输入用户名和密码,点击登录按钮。后端服务器接收到用户的登录请求后,验证用户的身份信息。如果用户身份验证成功,服务器会生成一个 JWT 令牌。这个令牌中包含了用户的一些信息。
令牌返回:服务器将生成的 JWT 令牌返回给客户端。
后续请求:当用户在商城中进行其他操作,客户端会在每个请求的头部携带这个 JWT 令牌,将其发送给服务器。服务器接收到请求后,会先验证 JWT 令牌的有效性,比如检查令牌是否过期、签名是否正确等。如果令牌有效,服务器就可以从令牌中获取用户的信息,然后根据用户的权限来处理请求。
用于通信双方以json数据格式安全的传输信息
组成为三个部分
第一部分 header 头 记录令牌类型,签名算法
第二部分payload 有效载荷 携带一些自定义的信息,默认信息
第三部分 signatrue 签名 防止token被修改 确保安全性,将header和payload融入并加入指定秘钥,通过签名算法计算而来
而前两部分 都采用了base64算法:一种基于64个可打印字符来表示二进制数据的编码方式,=是补位
1.使用jwt依赖
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
2.Java代码
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.junit.Test;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
public class jwt_Test {
/**
* 测试生成jwt令牌的方法
* 该方法主要功能是构造包含用户信息(id、用户名、密码等)的JWT令牌,
* 并设置令牌的过期时间为当前时间往后一小时,使用HS256算法进行签名。
*/
@Test
public void test() {
// 创建一个Map用于存放要放入JWT中的数据
Map<String, Object> dataMap = new HashMap<>();
// 放入用户id
dataMap.put("id", 1);
// 放入用户名
dataMap.put("username", "admin");
// 放入用户密码
dataMap.put("password", "123456");
// 使用Jwts.builder构建JWT
// 使用HS256算法进行签名,签名密钥为"aXRzdHU="
// 将前面构造的包含用户信息的dataMap作为claims放入JWT
// 设置JWT的过期时间为当前时间往后一小时(通过System.currentTimeMillis()获取当前时间戳,加上一小时对应的毫秒数)
// 最后通过compact()方法将构建好的JWT紧凑化并生成最终的令牌字符串
String jwt = Jwts.builder()
.signWith(SignatureAlgorithm.HS256, "aXRzdHU=")
.addClaims(dataMap)
.setExpiration(new Date(System.currentTimeMillis() + 3600 * 1000))
.compact();//构建令牌
}
}
/**
* 测试解析JWT令牌的方法
* 该方法使用给定的JWT令牌字符串,通过签名密钥验证其完整性并解析出其中的声明信息
* 注意:此方法中的签名密钥与生成令牌时使用的密钥可能存在编码不一致问题(详见注释)
*/
@Test
public void test2() {
// 待解析的JWT令牌字符串(示例令牌)
String token = "eyJhbGciOiJIUzI1NiJ9.eyJwYXNzd29yZCI6IjEyMzQ1NiIsImlkIjoxLCJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjoxNzQ3MDM5NDAyfQ.HhmsBD7OBueO_P02_b4oj5cGX1e2e2PbIyfXj1R_ELc";
// 使用Jwts.parser()创建解析器实例
// 设置签名密钥(注意:此处密钥为"itstu",而生成令牌时使用的是"aXRzdHU=",可能存在编码问题)
// parseClaimsJws()方法验证JWT签名并解析内容
// getBody()方法获取JWT中的声明信息(即载荷部分)
Claims claims = Jwts.parser()
.setSigningKey("itstu") // 签名密钥,需与生成令牌时一致(注意编码问题)
.parseClaimsJws(token)
.getBody();
// 打印解析出的声明信息(包含用户数据和过期时间等)
System.out.println(claims);
}
注意:jwt校验的时候使用的签名秘钥必须和生成jwt令牌时使用的秘钥是配套的
mac前端导入
1.安装 nginx
2.使用brew info nginx查看目录
3.替换nginx的安装目录的HTML文件
4.把替换conf文件夹里的nginx-conf文件
5.重启nginx 再去访问就成功了。
Filter过滤器
其实以前javaweb的时候学过 不过给忘记了嘻嘻
过滤器:可以把对资源的请求拦截下来,从而实现一些特殊的功能
通用操作:登录校验,统一编码处理,敏感字符处理
场景:每个功能需要校验一下员工是否登录了,但不能每次都加一次校验功能,所以将校验功能抽出来做一个过滤器 这样都可以使用
Filter开发步骤
定义一个类实现Filter接口(init doFilter destory)
配置:
@WebFilter(urlPatterns="/*")
@ServletComponentScan
注意事项:
如果过滤器中不执行放行操作,过滤器拦截到请求之后,就不会访问对应的资源
放行:chain.doFilter(request,response)
拦截器
Interceptor
使用步骤:
定义HandlerInterceptor接口
1.prehandle : 如果返回 true:放行 false:不放行
2.postHandle:运行之后运行
3.afterCompletion 前后端渲染之后
配置:定义一个配置类实现WebMvcConfigurer接口,注册拦截器(/**)
nginx反向代理
nginx反向代理就是,将前端发送的动态请求有nginx转发到服务器后端
前端访问地址和后端地址不一样
它还有nginx反向代理转换成后端地址
nginx反向代理的好处:
提高访问速度
nginx可以作缓存 当再次访问地址的时候,直接将缓存中的数据返回前端而不请求后端
进行负载均衡:
所谓负载均衡,就是把大量的请求按照我们指定的方式,均衡的分配给集群中的每台服务器
保证后端服务安全
配置方式
server{
listen 80;
server_name localhost;
location/api/{
proxy_pass http://8080/admin/; 反向代理
}
}
//TODO标识
代表没完成规定任务
MD5加密
password = DigestUtils.md5DigestAsHex(password.getBytes());
接口文档
学习了在开发中都是以接口文档开发的
在相应软件里导入json文档
Swagger常用注解
@Api : 用在类上,例如Controller控制层,表示类的解释
@ApiModel :用在pojo类,例如entity dto vo
@ApiModelProperty 用在字段属性上,描述信息
@ApiOperation 用在方法上,例如Controller的方法,说明方法的用途