前后分离
认证
如果在认证的时候出现跨域问题,就需要在配置文件中加上
前端页面,方法必须是post
认证成功后端
认证失败
printJsonData:
public void printJsonData(HttpServletResponse response,Result result){
try {
response.setContentType("application/json;charset=utf8");
ObjectMapper objectMapper=new ObjectMapper();
String s = objectMapper.writeValueAsString(result);
PrintWriter writer = response.getWriter();
writer.print(s);
writer.flush();
writer.close();
} catch (Exception e) {
e.printStackTrace();
}
}
携带信息访问后端
前端允许携带cookie
后端
完成设置之后,可以记录之前登录的信息 通过cookie来实现 一般不推荐
权限不允许
http.exceptionHandling().accessDeniedHandler(((request, response, accessDeniedException) -> {
Result result=new Result(403,"权限不允许",null);
printJsonData(response,result);
}));
JWT
Header
Header 部分是一个JSON对象,描述JWT的元数据,通常是下面的样子。
{
"alg": "HS256",
"typ": "JWT"
}
上面代码中,alg属性表示签名的算法(algorithm),默认是 HMAC SHA256 (写成 HS256) ;typ属性表示这个令牌(token)的类型(type), JWT令牌统一写为JWT。
Payload(荷载)
iss (issuer):签发人
exp (expiration time):过期时间
sub (subject):主题
aud (audience):受众
nbf (Not Before):生效时间
iat (lssued At):签发时间
jti (JWT ID):编号
除了官方字段,==你还可以在这个部分定义私有字段==,下面就是一个例子。
{
"sub": "1234567890",
"name" : "John Doe",
“userid”:2
"admin": true
}
注意,JWT 默认是不加密的,任何人都可以读到,所以不要把==秘密信息==放在这个部分。这个JSON 对象也要使用Base64URL 算法转成字符串。
Signature
Signature部分是对前两部分的签名,防止数据篡改。
首先,需要指定一个==密钥(secret)==。这个密钥只有==服务器才知道==,不能泄露给用户。然后,使用Header里面指定的==签名算法(默认是 HMAC SHA256)==,按照下面的公式产生签名。
HMACSHA256(
base64UrlEncode(header) + ".”"+base64UrlEncode(payload),
secret)
算出签名以后,把 Header、Payload、Signature 三个部分拼成一个字符串,每个部分之间用"点"(.)分隔,就可以返回给用户。
添加依赖
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.16</version>
</dependency>
jwt第一部分和第二部分并没有加密 使用的是base64编码格式 通过网站 进行反编码就可以得出原来的数据