Heim > Java > javaLernprogramm > Benutzerdefinierte Java-Filter und Interceptoren implementieren ThreadLocal-Thread-Schließung

Benutzerdefinierte Java-Filter und Interceptoren implementieren ThreadLocal-Thread-Schließung

WBOY
Freigeben: 2023-05-15 23:40:05
nach vorne
979 Leute haben es durchsucht

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.

ThreadLocal thread closure implementation steps

Method of encapsulating ThredLocal

/**
 * <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();
    }

}
Nach dem Login kopieren

Customized filter

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() {

    }
}
Nach dem Login kopieren

Customized interceptor

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!

Verwandte Etiketten:
Quelle:yisu.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage