车轮违章查询是什么网站开发建网站做淘宝客可以吗

张小明 2026/1/10 14:05:30
车轮违章查询是什么网站开发,建网站做淘宝客可以吗,眼镜厂官网,无限动力网站在企业级应用中#xff0c;多租户架构#xff08;Multi-Tenancy#xff09; 是一个非常常见的需求。比如 SaaS 平台中#xff0c;每个客户#xff08;租户#xff09;的数据需要隔离存储#xff0c;通常通过在每张业务表中增加一个 tenant_id 字段来实现。MyBatis-Plus …在企业级应用中多租户架构Multi-Tenancy是一个非常常见的需求。比如 SaaS 平台中每个客户租户的数据需要隔离存储通常通过在每张业务表中增加一个tenant_id字段来实现。MyBatis-Plus 提供了强大的多租户插件TenantLineInnerInterceptor可以自动在 SQL 中注入租户条件。但在某些特殊场景下我们可能希望临时忽略租户过滤比如管理员查看所有租户数据数据迁移、批量处理任务异步任务中绕过多租户限制这时候问题来了如何做到“一次设置全程忽略租户”即使在异步线程、嵌套方法调用中也能生效今天我们就来手把手教你实现这个高级功能一、需求场景说明假设你正在开发一个 SaaS 后台管理系统普通用户只能看到自己租户的数据但超级管理员可以查看全部租户的数据。✅ 正确做法在请求入口处判断是否为超级管理员如果是则在整个请求链路包括异步任务、Service 嵌套调用中都忽略租户过滤。❌ 反例做法每次调用 Mapper 时手动传参或写特殊 SQL代码冗余且容易出错。二、技术选型与原理Spring Boot 3.xMyBatis-Plus 3.5ThreadLocal InheritableThreadLocal用于在线程上下文中传递“忽略租户”标志自定义 MyBatis-Plus 租户处理器动态决定是否应用租户过滤 核心思想使用InheritableThreadLocal存储“是否忽略租户”的开关。因为普通ThreadLocal在异步线程如Async中无法继承父线程的值而InheritableThreadLocal可以。三、代码实现1. 自定义忽略租户上下文工具类// TenantIgnoreContext.java public class TenantIgnoreContext { // 使用 InheritableThreadLocal 支持子线程继承 private static final InheritableThreadLocalBoolean IGNORE_TENANT new InheritableThreadLocal(); public static void setIgnore(boolean ignore) { IGNORE_TENANT.set(ignore); } public static boolean isIgnore() { Boolean ignore IGNORE_TENANT.get(); return ignore ! null ignore; } public static void clear() { IGNORE_TENANT.remove(); } }⚠️ 注意必须在请求结束时调用clear()否则可能造成内存泄漏或污染下一个请求2. 自定义租户处理器关键// CustomTenantHandler.java import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler; import net.sf.jsqlparser.expression.Expression; import net.sf.jsqlparser.expression.LongValue; public class CustomTenantHandler implements TenantLineHandler { Override public Expression getTenantId() { // 正常返回租户ID比如从登录信息中获取 // 这里简化为固定值实际项目应从 SecurityContext 或 ThreadLocal 获取 return new LongValue(1L); } Override public String getTenantIdColumn() { return tenant_id; } Override public boolean ignoreTable(String tableName) { // 某些表不需要租户隔离比如字典表、系统配置表 return false; } // 重写此方法决定是否应用租户过滤 Override public boolean ignoreInsert(ListColumn columns, String tenantIdColumn) { return TenantIgnoreContext.isIgnore(); } // 关键全局控制是否忽略租户 Override public boolean ignoreTableWhenInsertOrUpdateOrDelete(String tableName) { return TenantIgnoreContext.isIgnore(); } // MyBatis-Plus 3.5 推荐重写此方法 Override public boolean ignoreTableForSelect(String tableName) { return TenantIgnoreContext.isIgnore(); } } 重点所有ignoreXXX方法都返回TenantIgnoreContext.isIgnore()实现统一控制。3. 配置 MyBatis-Plus 多租户插件// MybatisPlusConfig.java Configuration MapperScan(com.example.demo.mapper) public class MybatisPlusConfig { Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor new MybatisPlusInterceptor(); // 多租户插件 TenantLineInnerInterceptor tenantInterceptor new TenantLineInnerInterceptor(); tenantInterceptor.setTenantLineHandler(new CustomTenantHandler()); interceptor.addInnerInterceptor(tenantInterceptor); // 分页插件等其他拦截器... interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; } }4. 在 Controller 中使用支持同步/异步RestController public class UserController { Autowired private UserService userService; Autowired private AsyncTask asyncTask; GetMapping(/users) public ListUser getAllUsers(RequestParam(required false) Boolean admin) { try { // 如果是管理员开启忽略租户模式 if (Boolean.TRUE.equals(admin)) { TenantIgnoreContext.setIgnore(true); } // 同步调用 ListUser users userService.listAll(); // 异步调用子线程会继承 ignore 标志 asyncTask.logUserCount(); return users; } finally { // 必须清理防止 ThreadLocal 泄漏 TenantIgnoreContext.clear(); } } }// UserService.java Service public class UserService { Autowired private UserMapper userMapper; public ListUser listAll() { // 即使嵌套调用也能正确识别是否忽略租户 return userMapper.selectList(null); } }// AsyncTask.java Component public class AsyncTask { Autowired private UserMapper userMapper; Async public void logUserCount() { // 异步线程中依然能拿到 ignore 标志 long count userMapper.selectCount(null); System.out.println(Total users (ignoring tenant): count); } }✅ 测试结果访问/users?admintrue→ 查询所有租户数据访问/users→ 仅查询当前租户数据异步任务中也生效四、反例 注意事项❌ 反例1只在 Service 层硬编码忽略// 错误每次都要改无法复用 public ListUser getAllUsersForAdmin() { // 手动写 SQL 或关闭插件不可维护 }❌ 反例2忘记清理 ThreadLocal// 危险可能导致下一个请求错误地继承了 ignore 标志 TenantIgnoreContext.setIgnore(true); // ... 忘记 clear()⚠️ 注意事项必须使用InheritableThreadLocal否则Async、线程池中的任务无法继承上下文。务必在 finally 块中调用clear()建议封装成 AOP 切面自动清理。不要在过滤器/拦截器之外的地方随意设置避免逻辑混乱。测试时要覆盖同步、异步、异常路径确保上下文正确传播和清理。五、进阶建议用 AOP 自动管理上下文你可以写一个注解IgnoreTenant配合 AOP 自动设置和清理Target(ElementType.METHOD) Retention(RetentionPolicy.RUNTIME) public interface IgnoreTenant {}Aspect Component public class TenantIgnoreAspect { Around(annotation(IgnoreTenant)) public Object ignoreTenant(ProceedingJoinPoint joinPoint) throws Throwable { try { TenantIgnoreContext.setIgnore(true); return joinPoint.proceed(); } finally { TenantIgnoreContext.clear(); } } }然后在方法上直接使用IgnoreTenant GetMapping(/admin/users) public ListUser adminGetAllUsers() { return userService.listAll(); // 自动忽略租户 }总结通过InheritableThreadLocal 自定义 TenantHandler我们实现了✅ 一次设置全程生效✅ 支持同步、异步、嵌套调用✅ 代码清晰无侵入性✅ 安全可控避免内存泄漏这才是多租户系统中“临时绕过租户隔离”的优雅解法视频看了几百小时还迷糊关注我几分钟让你秒懂
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

中山专业外贸网站开发灵璧哪有做网站的

文章目录一、情景还原二、教程1.绑定域名2.配置URL重写3.编辑网站HSTS一、情景还原 我有一个网站,假设域名为:baidu.com,我现在想实现的效果是: 1.在浏览器里访问 baidu.com,自动跳转到 https://www.baidu.com 2.在浏…

张小明 2026/1/8 17:24:40 网站建设

郑州seo建站wordpress只显示文字

文本生成Web界面终极指南:5分钟快速部署AI创作平台 【免费下载链接】one-click-installers Simplified installers for oobabooga/text-generation-webui. 项目地址: https://gitcode.com/gh_mirrors/on/one-click-installers 想要体验强大的AI文本生成能力却…

张小明 2026/1/5 20:40:37 网站建设

网站建设和应用的情况wordpress整站主题

编译器&#xff1a;GCC传统的启动文件使用汇编语言实现&#xff0c;可读性很低&#xff0c;现在分析其内容&#xff0c;使用C语言重新实现一遍。完整的代码首先附上成品&#xff0c;使用C11标准&#xff1a;项目地址 &#xff1a;Gitee仓库#include <stddef.h>#include &…

张小明 2026/1/5 12:39:10 网站建设

网站推广服务公司前端毕业设计题目可以做哪些

在人工智能生成内容&#xff08;AIGC&#xff09;迅猛发展的当下&#xff0c;如何有效鉴别文本是否由AI生成&#xff0c;已成为教育、出版、内容创作等领域面临的迫切问题。众多免费AIGC检测网站应运而生&#xff0c;但其检测能力、可靠性和适用场景各不相同&#xff0c;让用户…

张小明 2026/1/5 11:44:04 网站建设

cms建站系统哪家好中国建设网站首页

文件太多找不到&#xff1f;这款宝藏搜索工具必须安利给你。 Everything 1.5 虽为 Alpha 版&#xff08;官网正式版为 1.4&#xff09;&#xff0c;但绿色单文件版的体验已经足够能打。 下载地址&#xff1a;https://pan.quark.cn/s/bf04b6287e4f 备用地址&#xff1a;https…

张小明 2026/1/6 16:47:49 网站建设