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

JAVA使用ThreadLocal实现全局存信息

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

JAVA使用ThreadLocal实现全局存信息

目录

概述

实现效果

1.TenantKeyContext(ThreadLocal的工具类)

2.WebMvcConfig注册拦截器

3.TenantKeyInterceptor拦截器

总结


概述

 实现的步骤如下:

    将登录需要的信息塞入当前线程(ThreadLocal)。使用拦截器拦截controller的请求,让ThreadLocal的信息保留。将接收的request参数转化为body接收参数。(拦截器不支持接收body的参数)在Serviceimpl调用ThreadLocal拿到信息。

实现效果

首先登陆信息是空的,通过body把登陆信息传递进去。

 body中传入登陆所需要的信息,从而实现了登陆。

1.TenantKeyContext(ThreadLocal的工具类)

主要是创建一个本地线程。

public class TenantKeyContext{

    private static final ThreadLocal TENANT_KEY = new ThreadLocal();

    public static void setTenantKey(String tenantKey) {
        TENANT_KEY.set(tenantKey);
    }

    public static String getTenantKey() {
        return TENANT_KEY.get();
    }

    public static void remove(){
        TENANT_KEY.remove();
    }
}

2.WebMvcConfig注册拦截器

注册一个拦截器,然后拦截controller所有请求。

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebMvcConfigimplements WebMvcConfigurer {

    @Bean
    public WebMvcConfiggetMyWebMvcConfig(){
        return new WebMvcConfig() {

            //注册拦截器
            @Override
            public void addInterceptors(InterceptorRegistry registry) {
                registry.addInterceptor(new TenantKeyInterceptor()).addPathPatterns("
    public static String getTenantKeyFromRequest(HttpServletRequest request) {
        String tenantKey = null;
        StringBuilder sb = new StringBuilder();
        try (InputStream inputStream = request.getInputStream();
             BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8))) {
            String line = "";
            while ((line = reader.readLine()) != null) {
                sb.append(line);
            }
            JSonObject jo = JSON.parseObject(sb.toString());
            tenantKey = jo.getString("tenantKey");
        } catch (Exception ignore) {
        }
        return tenantKey;
    }

}

总结

这样就实现了,将登录信息或者需要的某一个信息塞入本地线程,然后在需要的Service层去调用。

但是这样就存在一个问题,就是如果调用的地方,拿到的是一个空的信息怎么办,需要抛出一个异常,每层都往上抛很麻烦,这就涉及到了全局异常的捕获,然后手动直接抛出异常。

详情见手动抛出异常全局捕获异常,手动抛出异常

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

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

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