import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.ThreadContext;
import java.util.concurrent.*;
public class ShiroAwareThreadPoolExecutor extends ThreadPoolExecutor {
public ShiroAwareThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime,
TimeUnit unit, BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory, RejectedExecutionHandler handler) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, handler);
}
@Override
public void execute(Runnable command) {
super.execute(wrap(command, ThreadContext.getSubject()));
}
private Runnable wrap(final Runnable task, final Subject subject) {
return () -> {
try {
ThreadContext.bind(subject);
task.run();
} finally {
ThreadContext.unbindSubject();
ThreadContext.unbindSecurityManager();
}
};
}
}
public class ThreadPoolDemo {
public static void main(String[] args) {
// 建立自定義執行緒池
ExecutorService threadPool = new ShiroAwareThreadPoolExecutor(
10, 50, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<>(100),
Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy()
);
// 提交任務到執行緒池
threadPool.submit(() -> {
System.out.println("執行任務: " + Thread.currentThread().getName());
// 執行需要 Shiro SecurityManager 的操作
// 注意:這裡需要確保 Shiro 已經正確初始化
System.out.println("當前使用者: " + SecurityUtils.getSubject().getPrincipal());
});
// 關閉執行緒池
threadPool.shutdown();
}
}
多執行緒中自定義執行緒池與shiro導致的許可權錯亂問題解決
相關文章
- 解決POI多執行緒匯出時資料錯亂問題執行緒
- 多執行緒【執行緒池】執行緒
- java多執行緒與併發 - 執行緒池詳解Java執行緒
- Java多執行緒——執行緒池Java執行緒
- Qt中的多執行緒與執行緒池淺析+例項QT執行緒
- Java多執行緒-執行緒池的使用Java執行緒
- Android執行緒管理之ThreadPoolExecutor自定義執行緒池Android執行緒thread
- java多執行緒9:執行緒池Java執行緒
- kuangshenshuo-多執行緒-執行緒池執行緒
- JavaThread多執行緒執行緒池Javathread執行緒
- Java多執行緒18:執行緒池Java執行緒
- 多執行緒之手撕執行緒池執行緒
- java--執行緒池--建立執行緒池的幾種方式與執行緒池操作詳解Java執行緒
- WebMagic多執行緒導致註解失效問題Web執行緒
- 多執行緒程式設計,處理多執行緒的併發問題(執行緒池)執行緒程式設計
- 執行緒與多執行緒執行緒
- 多執行緒-執行緒池的概述和使用執行緒
- Java多執行緒中執行緒安全與鎖問題Java執行緒
- Android多執行緒之執行緒池Android執行緒
- 【Java】【多執行緒】執行緒池簡述Java執行緒
- java多執行緒系列之執行緒池Java執行緒
- 敲開阿里大門的執行緒、多執行緒和執行緒池面試專題阿里執行緒面試
- 淺談執行緒池(中):獨立執行緒池的作用及IO執行緒池執行緒
- 執行緒與執行緒池的那些事之執行緒池篇(萬字長文)執行緒
- 多執行緒------執行緒與程式/執行緒排程/建立執行緒執行緒
- 詳解執行緒池的作用及Java中如何使用執行緒池執行緒Java
- java中執行緒池的生命週期與執行緒中斷Java執行緒
- 多執行緒系列(三):執行緒池基礎執行緒
- C#多執行緒之旅(3):執行緒池C#執行緒
- Java多執行緒學習(八)執行緒池與Executor 框架Java執行緒框架
- 執行緒和執行緒池執行緒
- 執行緒 執行緒池 Task執行緒
- C#多執行緒學習(四) 多執行緒的自動管理(執行緒池)C#執行緒
- C# 多執行緒學習(4) :多執行緒的自動管理(執行緒池)C#執行緒
- 淺談執行緒池(上):執行緒池的作用及CLR執行緒池執行緒
- python實現自定義執行緒池Python執行緒
- Java併發 之 執行緒池系列 (1) 讓多執行緒不再坑爹的執行緒池Java執行緒
- 【java 多執行緒】多執行緒併發同步問題及解決方法Java執行緒