获取header中租户id
编写拦截器
@Component
public class HeadersInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String tenantId = request.getHeader("tenant-id");
//使租户id可全局获取即可,技术不限
StpUtil.getSession().set("tenantId ", tenantId );
return true;
}
}
配置拦截器
@SpringBootConfiguration
@EnableWebMvc
public class InterceptorsConfigure implements WebMvcConfigurer {
@Autowired
private HeadersInterceptor headersInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(headersInterceptor)
.excludePathPatterns("/tokens","/tokens/**","/users/**")
.addPathPatterns("/**");
}
mybatis-plus多租户插件
实现租户处理器
@Slf4j
@Component
public class MyTenantLineHandler implements TenantLineHandler {
/**
* 租户字段名
*/
private static final String SYSTEM_TENANT_ID = "tenant_id";
/**
* 需要过滤的表
*/
private static final List<String> IGNORE_TENANT_TABLES = Arrays.asList("s_user");
/**
* 获取租户ID值
*/
@Override
public Expression getTenantId() {
return new LongValue(Long.valueOf(StpUtil.getSession().get("tenantId").toString()));
}
/**
* 租户字段名,默认是tenant_id,如果想改成其他字段,在这里返回即可
*/
@Override
public String getTenantIdColumn() {
return SYSTEM_TENANT_ID;
}
/**
* 有不需要进行租户隔离的表,在这里返回true
*/
@Override
public boolean ignoreTable(String tableName) {
return IGNORE_TENANT_TABLES.contains(tableName);
}
}
在mybatis-plus配置中添加多租户插件
@Configuration
@MapperScan("com.example.tenant.mapper")
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new TenantLineInnerInterceptor(new MyTenantLineHandler()));
return interceptor;
}
}
注:建议数据库表都加上tenant_id字段