线程存储用户信息步骤及@Configuration介绍

1.线程存储用户信息步骤

1.1  由于在登陆时会查询数据库获取用户信息,所以可以在gateway网关中将获取的用户信息存放于header中,这样你的请求就会带有用户信息

例子:

//判断token是否有效
try {
    Claims claimsBody = AppJwtUtil.getClaimsBody(token);
    //是否过期
    int result = AppJwtUtil.verifyToken(claimsBody);
    if(result ==1 || result ==2){
        response.setStatusCode(HttpStatus.UNAUTHORIZED);
        return response.setComplete();
    }

    //获取用户信息
    Object userId = claimsBody.get("id");

    //存入header
    ServerHttpRequest serverHttpRequest = request.mutate().headers(httpHeaders -> {
        httpHeaders.add("userId", userId + "");
    }).build();

    //重置请求
    exchange.mutate().request(serverHttpRequest);

 该例子是通过解析token获得的用户信息。

1.2 创建一个拦截器,下面主要是该拦截器主要的AOP,对拦截器进行前置和后置处理

public class ApTokenInterceptor implements HandlerInterceptor {
    /**
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String userId = request.getHeader("userId");
        if(userId != null){
            //存入到当前线程中
            ApUser apUser = new ApUser();
            apUser.setId(Integer.valueOf(userId));
            ApThreadLocalUtil.setUser(apUser);
        }
        return true;
    }

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

 前置处理负责将用户信息存放于ThreadLocal线程中,后置处理则负责线程清理。例子中的ApThreadLocal内容如下:

public class ApThreadLocalUtil {

    private final static ThreadLocal<ApUser> AP_USER_THREAD_LOCAL = new ThreadLocal<>();

    //添加用户
    public static void setUser(ApUser apUser) {
        AP_USER_THREAD_LOCAL.set(apUser);
    }

    //获取用户
    public static ApUser getUser() {
        return AP_USER_THREAD_LOCAL.get();
    }

    //清理用户
    public static void clear() {
        AP_USER_THREAD_LOCAL.remove();
    }

 1.3 创建拦截器(容器组件),并将上面的AOP编程配置给拦截器

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
//拦截所有请求
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new ApTokenInterceptor()).addPathPatterns("/**");
    }
}

 

2.Configuration

注释@Configuration表明这是一个配置类,让这个类相当于一个bean xml 文件。@Bean注释其中的方法就相当于xml文件中的<bean/>标签。

@Configuration
public class DataSourceConfig {

	...
	@Bean
    public DataSource dataSource() {
    	...
        return dataSource;
    }
    @Bean(name = "transactionManager")
    public DataSourceTransactionManager transactionManager() {
        return new DataSourceTransactionManager(dataSource());
    }
	...
}

@Configuration和@Component区别在于@Configuration默认会加载类中互相调用的Bean单例,上面的代码只生成一个数据源。而@Component则直接会返回对象实例,上面会返回两个数据源。

总结:@Configuration默认会加载Bean的依赖关系,交叉方法引用会被重定向到容器的生命周期管理,所以就可以更方便的管理Bean依赖。

文章参考:真懂Spring的@Configuration配置类?你可能自我感觉太良好-腾讯云开发者社区-腾讯云 (tencent.com)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值