栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

day03

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

day03

1.token
什么是token:
    token的意思是“令牌”,是服务端生成的一串字符串,作为客户端进行请求的一个标识。
    
    当用户第一次登录后,服务器生成一个token并将此token返回给客户端,以后客户端只需带上这个token前来请求数据即可,无需再次带上用户名和密码。
    
    简单token的组成;uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,token的前几位以哈希算法压缩成的一定长度的十六进制字符串。为防止token泄露)。
    
token: 前端携带密码第一次登录时候  就会携带如下的  token格式  避免重复验证登录

eyJhbGciOiJIUzUxMiIsInppcCI6IkdaSVAifQ.

H4sIAAAAAAAAAC2L0QrDIAwA_yXPFTSLaezfWHXMQUGIhY2xf18Ke7vjuA88Z4cNVikkN2JHPqyOYiWXyj049Ckhlup3QVig5wlb4MghikReQM_dbn3rbMfVVU0frR_ZLJ_VLI9h3F7jfzLSdXZr9P0Bi1NUEYAAAAA.

MoOlTyjOlTdql-Oc0VSklwRDuZFS2eSKy89DNCSQbMBh3gUejElPp63i3nhGCC_0r1K6YG9jsQZBUqc9aLCglw
2项目中如何使用token去获取到用户的id信息 2.1大体实现流程

因为token涵盖了用户信息id,所以同项目一我们通过解析token,得到用户的信息,进而存入到ThreadLocal中,至此我们就能够在统一进程中,随时拿到当前用户的id信息。

2.2.3)实现思路

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IZdRtZ9V-1656921948696)(E:/heima01/10_黑马头条/day03-自媒体文章发布/笔记/自媒体文章发布.assets/image-20210426144603541.png)]

①:网关进行token解析后,把解析后的用户信息存储到header中

heima-leadnews-wemedia-gateway微服务中的AuthorizeFilter:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IdlUrL4j-1656921948697)(E:/heima01/10_黑马头条/day03-自媒体文章发布/笔记/自媒体文章发布.assets/image-20210704190939097.png)]

核心代码:

//获得token解析后中的用户信息
Object userId = claimsBody.get("id");
//在header中添加用户ID
ServerHttpRequest serverHttpRequest = request.mutate().headers(httpHeaders -> {
    httpHeaders.add("userId", userId + "");
}).build();


 //简写形式
//ServerHttpRequest serverHttpRequest =
//        request.mutate().header("userId", userId + "").build();
//重置header
exchange.mutate().request(serverHttpRequest).build();

②:自媒体微服务使用拦截器获取到header中的的用户信息,并放入到threadlocal中

思考:为什么不用Session存储登录用户信息?

如果想在Service或Dao需要获取用户信息的话,则需要将用户信息作为参数一直传递

使用ThreadLocal的好处:可以在同一线程中很方便的获取用户信息,不需要频繁的传递用户信息。

在heima-leadnews-utils中新增工具类

package com.heima.utils.thread;

public class WmThreadLocalUtils {

    private final static ThreadLocal WM_USER_THREAD_LOCAL = new ThreadLocal<>();

    
    public static void setUser(WmUser wmUser){
        WM_USER_THREAD_LOCAL.set(wmUser);
    }

    
    public static WmUser getUser(){
        return WM_USER_THREAD_LOCAL.get();
    }

    
    public static void clear(){
        WM_USER_THREAD_LOCAL.remove();
    }
}

在heima-leadnews-wemedia中新增拦截器

package com.heima.wemedia.interceptor;

@Slf4j
public class WmTokenInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //得到header中的信息
        String userId = request.getHeader("userId");
         //传统方式:存储用户登录信息到session中
        //request.getSession().setAttribute("userId", userId);

        //第二种方式:使用ThreadLocal保存登录用户信息
        if (userId != null) {
            //存入到当前线程中
            WmUser wmUser = new WmUser();
            wmUser.setId(Integer.valueOf(userId));
            WmThreadLocalUtils.setUser(wmUser); //保存到当前线程:每一个请求都是一个线程
            //user = WmThreadLocalUtils.getUser();
            log.info("wmTokenFilter设置用户信息到threadlocal中...");
        }

        return true;
    }

    
    @Override
    public void afterCompletion(HttpServletRequest request,
                                HttpServletResponse response, Object handler,
                                Exception ex) throws Exception {
        WmThreadLocalUtils.clear();
    }
}

配置使拦截器生效,拦截所有的请求


package com.heima.wemedia.config;

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //等同于
        registry.addInterceptor(new WmTokenInterceptor()).addPathPatterns("/**");
    }
}

eptorRegistry registry) {
//等同于
registry.addInterceptor(new WmTokenInterceptor()).addPathPatterns(”/”);
}
}

##### 
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1006316.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号