首页 > 其他分享 >ThreadLocal在拦截器中的使用

ThreadLocal在拦截器中的使用

时间:2023-05-29 14:59:04浏览次数:38  
标签:拦截器 request identityStr ThreadLocal identity 使用 public Identity

前置过滤捕获,写入context中,后置删除

每个request请求都有自己线程独享的数据,所以用到了ThreadLocal

1.添加拦截器

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new IdentityInterceptor())
                .addPathPatterns("/**");
    }
}

2.拦截器定义

@Slf4j
@Component
public class IdentityInterceptor implements HandlerInterceptor {

    /*
    根据HttpHeader中的roleType判断用户身份
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        var identityStr = request.getHeader("roleType");
        var loginContext = LoginContext.getLoginContext();

        var pin = loginContext != null ? loginContext.getPin() : null;
        Identity identity;
        if (Strings.isNullOrEmpty(identityStr) ||
                !Enums.getIfPresent(IdentityType.class, identityStr).isPresent()) {
            log.warn("Identity:[{}] not found,use default identity instead.url:{}, User:{}", identityStr, request.getRequestURL(), pin);
            identity = Identity.DEFAULT_IDENTITY;
        } else {
            identity = new Identity(identityStr);
        }
        Identity.setIdentity(identity); // 核心是这个,写入用户角色身份上下文
        log.info("RoleType:[{}],user:[{}]-Identity:[{}] for url:{}. ", identityStr, pin, identity.getIdentityType(), request.getRequestURL());

        return true;
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {

        log.info("remove Identity for [{}] from url {}"
                , Identity.getIdentity() == null ? "null" : Identity.getIdentity().getIdentityType()
                , request.getRequestURL());
        Identity.remove(); // 删除用户角色上下文数据
    }
}

3.Identity用户身份定义


标签:拦截器,request,identityStr,ThreadLocal,identity,使用,public,Identity
From: https://www.cnblogs.com/PythonOrg/p/17440339.html

相关文章

  • 使用H2数据库搭建springboot应用
    h2数据库有2中模型,一种是嵌入式,一种是服务端。嵌入式时,我们多个配置同一个地址就可以访问同一个数据集,服务端需要额外开启服务,再通过ip端口访问。这里我们介绍下怎么在springboot项目下开启服务端模式。1、在springboot应准备就绪后启动h2服务publicclassH2Serverimplements......
  • Python使用to_csv导出文件时参数注意事项
    使用to_csv导出文件时,一定要指定index参数和encoding参数这两个参数;index参数:默认为True,会添加一列标记数据索引。encoding参数:如果不指定utf_8_sig,使用默认参数值,则导出的文件可能会有乱码或串列。cake_data.to_csv(r"C:\E\data.csv",index=False,encoding='utf_8_sig')......
  • 线性插值的计算公式和使用场景
    线性插值是一种常用的数学方法,用于在给定一些已知数据点的情况下,通过构造一条直线来估计未知数据点的值。它是插值方法中最简单和最常用的一种。线性插值可以应用于多个领域,包括科学、工程、计算机图形学、金融等。在本文中,我们将介绍线性插值的原理、公式和一些常见的使用场景。......
  • Python中的Union这个类的使用
    在Python中,Union是typing模块中定义的一个类,用于表示多个类型中的任意一种类型。Union类型可以用于表示参数或函数返回值等多种情况下可能的不同类型。具体而言,Union类型可以使用typing.Union[type1,type2,...]的语法来定义,其中type1、type2等参数为可能的类型。例......
  • super()在 Django 模板视图中使用
    Django模板视图用于呈现HTML模板并将数据传递给它们以供显示。super()您可以在Django模板视图中使用,轻松地从父模板视图继承属性和方法,并根据需要自定义或扩展它们。Django模板视图的一种常见用法super()是在get_context_data方法中,该方法用于将数据传递给模板以进行渲染。......
  • 使用 Angular proxy 解决前端跨域问题
    在Angular应用程序的前端部分绕过CORS限制有两个选项:(1)JSONP和(2)Angular代理。其中JSONP无法设置头部信息,所以如果需要设置头部信息,可以使用Angular代理。proxy.conf.json文件是Angular应用程序中的一个配置文件,用于配置代理服务器。它的主要作用是帮助前端开发人员在开发和调......
  • 使用 Java 代码调用 openAI 的 ChatGPT API
    前提:在https://beta.openai.com/account/api-keys注册一个自己的APIkey.要在JavaSpringFramework中使用OpenAIAPI,您需要使用一个能够处理HTTP请求的库。其中一个流行的库是SpringRestTemplate库。RestTemplate是一个强大而灵活的库,可以轻松地发送HTTP请求并处理响应。首......
  • CSS-Select 开发包和使用案例分享
    CSS-Select是一个用于解析CSS选择器的工具包,它提供了一套完整的API,可以方便地进行CSS选择器的解析和匹配。该工具包是基于解析器生成器jison开发的,可以在Node.js环境下使用。下面,我们来详细介绍一下CSS-Select工具包的作用和使用方法。作用CSS-Select工具包的主要......
  • Windows下使用Socks5代理IP的完全指南
       Socks5代理是一种常用的网络代理协议,它能够为用户提供更高的隐私保护和更广泛的应用支持。本文将详细介绍如何在Windows操作系统下使用Socks5代理IP,并提供一些实用技巧和注意事项,帮助读者更好地理解和应用代理IP技术。一、什么是Socks5代理IP?   Socks5代理是一种网络......
  • @Validated注解的使用
    @Validated注解修饰controller的入参参数上入参参数内部使用其他细节注解进行判断看样例@ApiOperation(value="添加修改ump告警规则")@PostMapping("config")publicResultsaveOrUpdateConfig(@Validated@RequestBodyRadarScreenUmpConfigconfig){ radarScreenUmpS......