springboot如何完美通过token获取用户信息

 更新时间:2023年12月06日 10:37:59   作者:只会写bug的靓仔  
这篇文章主要给大家介绍了关于springboot如何完美通过token获取用户信息的相关资料, Token是在服务端产生的,如果前端使用用户名/密码向服务端请求认证,服务端认证成功,那么在服务端会返回Token给前端,需要的朋友可以参考下

1. 什么是Token?

身份验证令牌(Authentication Token):在身份验证过程中,“token”
可以表示一个包含用户身份信息的令牌。

例如

Token(JWT)是一种常见的身份验证令牌,它包含用户的身份信息(例如用户名或用户ID)以及其他相关信息,如权限或过期时间。无意义令牌token,这种一般在获取后通过nosql查询token对应的用户信息。

当然,设计token网上大多有现成的解决方案,但是通过token如何拿个人信息呢?

2. 如何优雅的获取用户信息?

虽然token是用户凭证,但是在后端中,token是不能直接和数据进行交互的,我们需要转换成token用户信息。

解决思路:

我们大多会在过滤器filter进行token检验,在这里我们已经已经从header中解析并且验证了token了。如果我们要是再在Controller中获取header,在解决,感觉一点也不优雅。

我们的两种解决方案:

通过header进行解析(推荐):

哈哈哈,没想到我们还是从这种low的方法里弄的吧。 实际上nosql性能很不错,再查一次也无伤大雅,并且这种方式耦合度较低,符合代码规范。

我们可以通过注解的方式,可以尽量美观很多

1.1. 创建CurrentUserUuid接口

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface CurrentUserUuid {
}

1.2. 创建oginUserHandlerMethodArgumentResolver解析器

@Component
public class LoginUserHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {
    @Resource
    private TokenUtil tokenUtil;

    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        return parameter.hasParameterAnnotation(CurrentUserUuid.class) &&
                parameter.getParameterType().isAssignableFrom(String.class);
    }

    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer container,
                                  NativeWebRequest request, WebDataBinderFactory factory) {
        // header中获取用户token
        String token = request.getHeader("Authorization");
        // TODO 根据userId获取User信息,这里省略,直接创建一个User对象。
        return tokenUtil.getUserToken(token);
    }
}

过滤器二次封装请求体

我们可以在第一次过滤器查的时候,把对应的信息封装到请求中,但是请求多变,get,post参数一般在不同的位置上,需要写更复杂的结构

@Override	
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)	
            throws IOException, ServletException {	
    HttpServletRequest httpRequest = (HttpServletRequest) request;	
    HttpServletResponse httpResponse = (HttpServletResponse) response;	
    String token = request.getHeader("token");	
    JWTResult result = JWTUtils.checkToken(token);	
    Long userId = result.getUserId();	
    HttpServletRequestWrapper requestWrapper = new HttpServletRequestWrapper(httpRequest) {	
            @Override	
            public String[] getParameterValues(String name) {	
                if (name.equals("loginUserId")) {	
                    return new String[] { userId .toString() };	
                }	
                return super.getParameterValues(name);	
            }	
            @Override	
            public Enumeration<String> getParameterNames() {	
                Set<String> paramNames = new LinkedHashSet<>();	
                paramNames.add("loginUserId");	
                Enumeration<String> names =  super.getParameterNames();	
                while(names.hasMoreElements()) {	
                    paramNames.add(names.nextElement());	
                }	
                return Collections.enumeration(paramNames);	
            }	
    };	
    chain.doFilter(requestWrapper, httpResponse);	
}

这种好处是只需要查一次,但是请求参数多变,需要写很多额外的解构去处理,并且增加了耦合度

3. 总结

我还是推荐方法1,无疑,虽然多查一次,但是结构简单,耦合度低,并且代码较为简洁。

到此这篇关于springboot如何完美通过token获取用户信息的文章就介绍到这了,更多相关springboot token获取用户信息内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • delphi 字符串处理中的怪异现象与处理方式

    delphi 字符串处理中的怪异现象与处理方式

    今天小编就为大家分享一篇delphi 字符串处理中的怪异现象与处理方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02
  • delphi字符串分隔函数用法实例

    delphi字符串分隔函数用法实例

    这篇文章主要介绍了delphi字符串分隔函数用法,通过自定义函数SeparateTerms2实现将字符串分割后存入字符串列表的功能,具有一定的实用价值,需要的朋友可以参考下
    2014-12-12
  • 插件管理框架 for Delphi(一)

    插件管理框架 for Delphi(一)

    插件管理框架 for Delphi许多软件采用“插件”(PlugIns)来扩展其功能,比如PhotoShop所支持的各类滤镜就是插件;我们所熟知的Winamp,也有许多皮肤以及可视效果插件。再有微软的windows media player,以及QQ,冲浪软件Opera……采用插件技术的软件数不胜数,而各个软件的具体实现方式也是五花八门,各有特点。
    2008-03-03
  • Delphi实例演示Rect、Bounds生成TRect的区别

    Delphi实例演示Rect、Bounds生成TRect的区别

    这篇文章主要介绍了Delphi实例演示Rect、Bounds生成TRect的区别,需要的朋友可以参考下
    2014-07-07
  • delphi制作wav文件的方法

    delphi制作wav文件的方法

    这篇文章主要介绍了delphi制作wav文件的方法,涉及Delphi操作多媒体文件的相关技巧,需要的朋友可以参考下
    2015-06-06
  • Delphi实现木马文件传输代码实例

    Delphi实现木马文件传输代码实例

    这篇文章主要介绍了Delphi实现木马文件传输的方法,对于了解木马的运行原理有一定的帮助,需要的朋友可以参考下
    2014-07-07
  • delphi 判断字符串是否包含汉字,正则版与非正则版实现

    delphi 判断字符串是否包含汉字,正则版与非正则版实现

    这篇文章主要介绍了delphi 判断字符串是否包含汉字,正则版与非正则版实现,需要的朋友可以参考下
    2022-12-12
  • Windows API GetLastError()函数返回值含义解释

    Windows API GetLastError()函数返回值含义解释

    这篇文章主要介绍了Windows API GetLastError()函数返回值含义解释,本文罗列了所有错误代码及中文注释,需要的朋友可以参考下
    2015-05-05
  • TImage组件实现保存图片到Stream

    TImage组件实现保存图片到Stream

    这篇文章主要介绍了TImage组件实现保存图片到Stream以及从stream中读取图片的方法,非常的实用,有需要的小伙伴可以参考下
    2016-05-05
  • Delphi菜单组件TMainMenu使用方法详解

    Delphi菜单组件TMainMenu使用方法详解

    这篇文章主要为大家详细介绍了Delphi菜单组件TMainMenu的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11

最新评论