代码:

public interface TokenManager {

    /**
* 创建token
* @param userInfo
* @return
*/
String getToken(UserInfo userInfo); /**
* 刷新用户
* @param token
*/
void refreshUserToken(String token); /**
* 用户退出登陆
* @param token
*/
void loginOff(String token); /**
* 获取用户信息
* @param token
* @return
*/
UserInfo getUserInfoByToken(String token); }

具体实现:

@Component
public class RedisTokenManager implements TokenManager { @Autowired
private RedisUtils redisUtils; @Autowired
private GlobalConfig globalConfig; /**
* 创建token
* @param userInfo
* @return
*/
public String getToken(UserInfo userInfo){
//使用uuid作为源token
String token = UUID.randomUUID().toString().replace("-", "");
String token_format=String.format(Constants.TOKEN_FORMAT,token);
redisUtils.set(token_format,userInfo,globalConfig.getTokenExpires());
return token;
} /**
* 刷新用户
* @param token
*/
public void refreshUserToken(String token){
token=String.format(Constants.TOKEN_FORMAT,token);
if(redisUtils.exists(token)){
redisUtils.setExpireTime(token, globalConfig.getTokenExpires());
}
} /**
* 用户退出登陆
* @param token
*/
public void loginOff(String token){
token=String.format(Constants.TOKEN_FORMAT,token);
redisUtils.remove(token);
} /**
* 获取用户信息
* @param token
* @return
*/
public UserInfo getUserInfoByToken(String token){
token=String.format(Constants.TOKEN_FORMAT,token);
if(redisUtils.exists(token)){
return (UserInfo)redisUtils.get(token);
}
return null;
}
}

对TokenManager进行二次封装,每次操作不需要token参数

@Component
public class AuthManager { @Autowired
private TokenManager tokenManager; /**
* 获取请求体
* @return
*/
public HttpServletRequest getRequest(){
return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
} /**
* 登录
* @param userInfo
* @return
*/
public String signIn(UserInfo userInfo){
return tokenManager.getToken(userInfo);
} /**
* 获取该访问用户信息
* @return
*/
public UserInfo getUserInfo(){
HttpServletRequest request=getRequest();
String token=request.getAttribute(Constants.USER_TOKEN).toString();
UserInfo userInfo=tokenManager.getUserInfoByToken(token);
if(userInfo==null){
throw new AuthException("该用户已过期", HttpStatus.UNAUTHORIZED.value());
}
return userInfo;
} /**
* 刷新该登录用户,延时
*/
public void refreshUserInfo(){
HttpServletRequest request=getRequest();
String token=request.getAttribute(Constants.USER_TOKEN).toString();
tokenManager.refreshUserToken(token);
} /**
* 注销该访问用户
*/
public void loginOff(){
HttpServletRequest request=getRequest();
String token=request.getAttribute(Constants.USER_TOKEN).toString();
tokenManager.loginOff(token);
}
}

上面是对用户信息基本操作

对用户进行控制,部分接口可以不登陆访问

@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface AuthIgnore { }

拦截器:

@Component
public class AuthorizationInterceptor extends HandlerInterceptorAdapter { @Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
AuthIgnore annotation;
if(handler instanceof HandlerMethod) {
annotation = ((HandlerMethod) handler).getMethodAnnotation(AuthIgnore.class);
}else{
return true;
} //如果有@AuthIgnore注解,则不验证token
if(annotation != null){
return true;
} //获取用户凭证
String token = request.getHeader(Constants.USER_TOKEN);
if(StringUtils.isBlank(token)){
token = request.getParameter(Constants.USER_TOKEN);
}
if(StringUtils.isBlank(token)){
Object obj = request.getAttribute(Constants.USER_TOKEN);
if(null!=obj){
token=obj.toString();
}
} //token凭证为空
if(StringUtils.isBlank(token)){
throw new AuthException(Constants.USER_TOKEN + "不能为空", HttpStatus.UNAUTHORIZED.value());
} return true;
}
}

如果token参数必须放在请求体中,直接读取请求体会报错,requestbody miss

解决方法:https://www.cnblogs.com/hongdada/p/9171739.html

这里的注解只是标注那些不需要登陆的接口

上面相关redis操作在上面也写过,请看前面文章。

SpringBoot 通过token进行身份验证,存储redis的更多相关文章

  1. 基于 Token 的身份验证方法

    使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录.大概的流程是这样的: 客户端使用用户名跟密码请求登录 服务端收到请求,去验证用户名与密码 验证成功后,服务端会签发一个 Toke ...

  2. (转)基于 Token 的身份验证

    原文:https://ninghao.net/blog/2834 最近了解下基于 Token 的身份验证,跟大伙分享下.很多大型网站也都在用,比如 Facebook,Twitter,Google+,G ...

  3. 基于 Token 的身份验证:JSON Web Token(附:Node.js 项目)

    最近了解下基于 Token 的身份验证,跟大伙分享下.很多大型网站也都在用,比如 Facebook,Twitter,Google+,Github 等等,比起传统的身份验证方法,Token 扩展性更强, ...

  4. 基于token的身份验证JWT

    传统身份验证的方法 HTTP 是一种没有状态的协议,也就是它并不知道是谁是访问应用.这里我们把用户看成是客户端,客户端使用用户名还有密码通过了身份验证,不过下回这个客户端再发送请求时候,还得再验证一下 ...

  5. [转载]基于 Token 的身份验证

    作者:王皓发布于:2015-08-07 22:06更新于:2015-08-07 22:07 最近了解下基于 Token 的身份验证,跟大伙分享下.很多大型网站也都在用,比如 Facebook,Twit ...

  6. JavaWeb—基于Token的身份验证

    传统身份验证的方法 HTTP Basic Auth HTTP Basic Auth简单点说明就是每次请求API时都提供用户的username和password,简言之,Basic Auth是配合RES ...

  7. 基于 Token 的身份验证:JSON Web Token(JWT)

    1.传统身份验证和JWT的身份验证 传统身份验证:       HTTP 是一种没有状态的协议,也就是它并不知道是谁是访问应用.这里我们把用户看成是客户端,客户端使用用户名还有密码通过了身份验证,不过 ...

  8. JAVA中的Token 基于Token的身份验证

    最近在做项目开始,涉及到服务器与安卓之间的接口开发,在此开发过程中发现了安卓与一般浏览器不同,安卓在每次发送请求的时候并不会带上上一次请求的SessionId,导致服务器每次接收安卓发送的请求访问时都 ...

  9. 基于 Token 的身份验证

    最近了解下基于 Token 的身份验证,跟大伙分享下.很多大型网站也都在用,比如 Facebook,Twitter,Google+,Github 等等,比起传统的身份验证方法,Token 扩展性更强, ...

随机推荐

  1. tortoise svn中更改用户

    1. Open Windows Explorer.2. Right-click anywhere in the window.3. Click TortoiseSVN → Settings.4. Cl ...

  2. javascript(三):对象

    对象(object)是javascript中很重要的数据类型.对象是“键值对”的集合,同时也是无序的.(注意:对象结尾处有分号) var ob1={ a1:'name',//a1可以加引号或者不加 a ...

  3. UIView的背景颜色

    一个UIColor代表一种颜色,通过UIColor的类方法,可以获得很多常用的颜色 + (UIColor *)blackColor;      // 0.0 white 黑色 + (UIColor * ...

  4. Palindrome Bo (预处理 + 区间DP)

    先进行离散化,然后再预处理出所有位置的下一个元素,做好这一步对时间的优化非常重要. 剩下的就是一般的DP了.区间DP #include<bits/stdc++.h> using names ...

  5. arm cortex-m0plus源码学习(二)AMBA3.0_ AHBLite

    1. AMBA总线概述 AMBA2.0 以上版本都是基于单沿时钟.单向信号线的协议[1]. 现在市场上大部分的基于 AMBA 架构的 SoC 产品, 系统总线采用 AHB, 外部总线采用 APB.系统 ...

  6. 【javascript】内存泄露及其解决办法

    1.内存泄露:一般由于开发者使用不当导致不用的内存没有被操作系统或者空闲内存池回收释放. 2.造成内存泄露的常见原因: 1) 意外的全局变量引起的内存泄露 2)闭包引起的内存泄露 闭包可以维持函数内局 ...

  7. ymPrompt,jcs缓存架构

    jcs.auxiliary.LTCP=org.apache.jcs.auxiliary.lateral.socket.tcp.LateralTCPCacheFactory#jcs.auxiliary. ...

  8. ASP.NET Core Web API 索引 (更新Redis in .NET Core)

    https://www.cnblogs.com/cgzl/p/9178672.html

  9. JMX堆栈分析

    线程堆栈: 线程堆栈也称线程调用堆栈,是虚拟机中线程(包括锁)状态的一个瞬间快照,即系统在某一个时刻所有线程的运行状态,包括每一个线程的调用堆栈,锁的持有情况.虽然不同的虚拟机打印出来的格式有些不同, ...

  10. 安装PHP扩展32位与64位的误区(x86与x64的查看)

    在安装PHP扩展(DLL,SO),除了需要对应的PHP版本外,在WINDOWS还需要区分(TS线程,NTS非线程),如何判断呢? 1.如何判断是NTS还是TS(WINDOWS用户) 看PHP所在目录中 ...