Spring - wyjaśnienie metody

0

Mam klasę implementującą interfejs HandlerInterceptor, może mi ktoś wyjaśnić czym jest dokładnie Object handler w sygnaturze metody preHandle i jaką spełnia rolę ?

 package com.packt.webstore.interceptor;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import org.springframework.util.StopWatch;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class PerformanceMonitorInterceptor implements HandlerInterceptor {
	ThreadLocal<StopWatch> stopWatchLocal = new ThreadLocal<StopWatch>();
	Logger logger = Logger.getLogger(this.getClass());

	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		StopWatch stopWatch = new StopWatch(handler.toString());
		stopWatch.start(handler.toString());
		stopWatchLocal.set(stopWatch);
		logger.info("Przetwarzanie żądania do ścieżki: " + getURLPath(request));
		logger.info("Przetwarzanie żądania rozpoczęto o: " + getCurrentTime());
		return true;
	}

	public void postHandle(HttpServletRequest arg0, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		logger.info("Przetwarzanie żądania zakończono o: " + getCurrentTime());
	}

	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
			Exception exception) throws Exception {
		StopWatch stopWatch = stopWatchLocal.get();
		stopWatch.stop();
		logger.info("Łączny czas przetwarzania żądania: " + stopWatch.getTotalTimeMillis() + " ms");
		stopWatchLocal.set(null);
		logger.info("=======================================================");
	}

	private String getURLPath(HttpServletRequest request) {
		String currentPath = request.getRequestURI();
		String queryString = request.getQueryString();
		queryString = queryString == null ? "" : "?" + queryString;
		return currentPath + queryString;
	}

	private String getCurrentTime() {
		DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy 'o' hh:mm:ss");
		Calendar calendar = Calendar.getInstance();
		calendar.setTimeInMillis(System.currentTimeMillis());
		return formatter.format(calendar.getTime());
	}
}
1

Dostajesz dostęp do handlera, czyli obiektu który będzie przetwarzał request i wyciągnąć z niego dodatkowe informacje. Może to być np. HandlerMethod i po zrzutowaniu będziesz mógł np. sprawdzić jaka metoda będzie obsługiwać dany request

0

Dałem łapę ale w sumie dalej nie rozumiem.

0

Wklejam kawałek kodu, oprócz tego postaram się to wyjaśnić. Metoda preHandle zostaje wywołana zanim handler przetworzy request. Object handler to właśnie ten handler. W przykładowym kodzie jest to HandlerMethod i z niego możesz się dowiedzieć jaka metoda obsłuży request, w jakim beanie jest zadeklarowana, jakie są na niej adnotacje i kilka innych informacji, dzięki którym możesz sam sterować logiką, np. na podstawie tego czy metoda posiada stosowną adnotację.

Co więcej możesz w metodzie preHandle zwrócić false i wtedy sam musisz zadbać o to, aby zmodyfikować odpowiednio response, bo już żaden handler nie będzie przetwarzał requestu. Scenariusz - metoda, która obsługuje żądanie nie ma jakieś adnotacji dot. bezpieczeństwa to wtedy zwracasz false i modyfikujesz response tak żeby użytkownik dostał odpowiednią informację.

 	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object object) throws Exception {
		log.info("Before process request");
		log.info(object.getClass().getName());
		if (object instanceof HandlerMethod) {
			HandlerMethod handler = (HandlerMethod) object;
			log.info(handler.getMethod().getName());
		}
		return true;
	}

1 użytkowników online, w tym zalogowanych: 0, gości: 1