Heim >Java >javaLernprogramm >Benutzerdefinierte Java-Filter und Interceptoren implementieren ThreadLocal-Thread-Schließung
Thread-Schließung verwendet im Allgemeinen die folgenden drei Methoden:
Ad-hoc-Thread-Schließung: Programmsteuerungsimplementierung, schlimmstenfalls ignorieren
Stack-Schließung: lokale Variablen, keine Parallelitätsprobleme
ThreadLocal-Thread-Schließung: Eine besonders gute Abschlussmethode
Methode 2 wird am häufigsten verwendet. In diesem Artikel wird hauptsächlich Methode 3 erläutert. Das SpringBoot-Projekt implementiert ThreadLocal-Thread-Schließung durch benutzerdefinierte Filter und Interceptoren. Implementieren Sie den benutzerdefinierten Filter der Filterschnittstelle und erben Sie den benutzerdefinierten Interceptor HandlerInterceptorAdapter.
/** * <p>自定义RequestHolder</p></p> * * @Author zjq * @Date 2021/12 */ public class RequestHolder { private final static ThreadLocal<Long> requestHolder = new ThreadLocal<>(); public static void set(Long id) { requestHolder.set(id); } public static Long get() { return requestHolder.get(); } public static void remove() { requestHolder.remove(); } }
Customized interceptor inherits the Filter interface and implements the ThredLocal.add() method
/** * <p>自定义过滤器</p> * * @Author zjq * @Date 2021/12/7 */ @Slf4j public class HttpFilter implements Filter { /** * 为Filter初始化 提供支持 * * @param filterConfig * @throws ServletException */ @Override public void init(FilterConfig filterConfig) throws ServletException { } /** * 拦截到要执行的请求时,doFilter就会执行。这里我们可以写对请求和响应的预处理。 * FilterChain把请求和响应传递给下一个 Filter处理 * * @param servletRequest * @param servletResponse * @param filterChain * @throws IOException * @throws ServletException */ @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { //把普通servlet强转成httpServlet HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest; Long threadId = Thread.currentThread().getId(); log.info("do filter,threadId:{} servletPath:{}", threadId, httpServletRequest.getServletPath()); //把当前线程id放入requestHolder RequestHolder.set(threadId); //放行 filterChain.doFilter(httpServletRequest, servletResponse); } /** * Filter 实例销毁前的准备工作 */ @Override public void destroy() { } }
Customized interception The controller removes the contents of ThredLocal, nachdem der Thread verwendet wurde, um einen Speicherüberlauf zu vermeiden /threadLocal/test, die Konsolenausgabe lautet wie folgt:
Das obige ist der detaillierte Inhalt vonBenutzerdefinierte Java-Filter und Interceptoren implementieren ThreadLocal-Thread-Schließung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!