Java实现基于token认证(springboot)
为什么要用 Token?
可以解决哪些问题呢?
- Token 完全由应用管理,所以它可以避开同源策略
- Token 可以避免 CSRF 攻击(http://dwz.cn/7joLzx)
- Token 可以是无状态的,可以在多个服务间共享
1、引入依赖
2设置过期时间和秘钥
3实现token
public static String gettoken(String name ,String password) {
String token = "";
Date time = new Date(System.currentTimeMillis() + EXPIRE_DATE);
Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);
//设置头部信息
Map<String, Object> header = new HashMap<>();
header.put("typ", "JWT");
header.put("alg", "HS256");
//携带username,password信息,生成签名
try {
token = JWT.create()
.withHeader(header)
.withClaim("username", name)
.withClaim("password", password)
.withExpiresAt(time)
.sign(algorithm);
return token;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
4验证token
public static boolean verify(String token){
/**
* @desc 验证token,通过返回true
* @create 2019/1/18/018 9:39
* @params [token]需要校验的串
**/
try {
Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);
JWTVerifier verifier = JWT.require(algorithm).build();
DecodedJWT jwt = verifier.verify(token);
//String signature = jwt.getSignature();
// System.out.println(signature);
return true;
}catch (Exception e){
e.printStackTrace();
return false;
}
}
5拦截器
public class TestHandle implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String access_token = request.getHeader("access_token");
if(access_token == null){
return false;
}
System.out.println("拦截器"+access_token);
boolean verify = Test.verify(access_token);
if(verify){
return true;
}else{
request.getRequestDispatcher("/index").forward(request,response);
return false;
}
}
6实现WebMvcConfigurer接口的拦截方式你们自己写
最后客户携带token请求服务