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)