Spring MVC – 14 – Interceptors & Log4J

Merhaba Arkadaslar
Bu bolumde Interceptor kavramini inceleyecegiz ve Log4J loglama framework’unu projemize entegre edecegiz. Log4J konusunda on bilgi icin ; Apache Log4j

Oncelikle Log4J icin Maven dependency tanimini ekleyelim;

<properties>
	...
	<log4j.version>1.2.17</log4j.version>
	....
</properties>

<dependency>
	<groupId>log4j</groupId>
	<artifactId>log4j</artifactId>
	<version>${log4j.version}</version>
</dependency>

Internationalization konusunu incelerken LocaleChangeInterceptor sinifini kullanmistik.
LocaleChangeInterceptor sinifini inceleyecek olursak HandlerInterceptorAdapter sinifini kalittigini gorebiliriz.

public class LocaleChangeInterceptor extends HandlerInterceptorAdapter {....}

HandlerInterceptorAdapter sinifi da AsyncHandlerInterceptor arabirimini uygulamaktadir.

public abstract class HandlerInterceptorAdapter implements AsyncHandlerInterceptor {

AsyncHandlerInterceptor arabirimi HandlerInterceptor arabirimini kalitir.

public interface AsyncHandlerInterceptor extends HandlerInterceptor {...}

HandlerInterceptor arabiriminde 3 metot tanimlanmaktadir.

preHandle : Request/Istek , controller tarafindan karsilanmadan once bu metot calisacaktir.
postHandle : Controller calistiktan sonra postHandle metodu calisacaktir.
afterCompletion : Request lifecycle tamamlandiktan sonra afterCompletion metodu calisacaktir.

public interface HandlerInterceptor {

boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
    throws Exception;

void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
		throws Exception;
void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception;

log4j.properties
log4j.properties dosyasi default olarak source folder altinda yer aldiginda Spring MVC tarafindan okunacaktir.

tum loglar icin all.txt dosyasini , AuditingInterceptor sinifi icin auditLogger tanimini ekleyelim.
Log dosyalarimiz Tomcat altinda yer alacaktir.
NOT : audit.txt ve all.txt icin location bilgisini kendinize uygun sekilde tanimlayabilirsiniz.

# Auditing Logger
log4j.logger.auditLogger=INFO, auditLogger
log4j.appender.auditLogger=org.apache.log4j.RollingFileAppender
log4j.appender.auditLogger.File=${catalina.base}/audit.txt
log4j.appender.auditLogger.layout=org.apache.log4j.PatternLayout
log4j.appender.auditLogger.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %c : %m%n

AuditingInterceptor.java

package _13.audit.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.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

public class AuditingInterceptor extends HandlerInterceptorAdapter {

	private Logger logger = Logger.getLogger("auditLogger");
	private String user;
	private String productId;

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse arg1, Object handler) throws Exception {

		System.out.println("preHandle");

		if (request.getRequestURI().endsWith("add")) {

			if (request.getMethod().equals("GET")) {
				//
				logger.info("preHandle : GET request");
			}

			if (request.getMethod().equals("POST")) {
				user = request.getRemoteHost();
				productId = request.getParameter("productId");
				//
				logger.info("preHandle : POST request");
			}
		}
		return true;
	}

	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
			Exception arg3) throws Exception {

		System.out.println("afterCompletion");
		// urun ekledikten sonra redirect islemi sonrasinda HTTP 302 POST
		// request olusur.
		if (request.getRequestURI().endsWith("add") && response.getStatus() == 302) {
			logger.info(String.format("A New product[%s] Added by %s on %s", productId, user, getCurrentTime()));
		}
	}

	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {

		System.out.println("postHandle");

		if (request.getRequestURI().endsWith("add")) {

			if (request.getMethod().equals("GET")) {
				//
				logger.info("postHandle : GET request");
			}

			if (request.getMethod().equals("POST")) {
				logger.info("postHandle : POST request");
			}
		}

	}

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

}

13.audit.xml
XML konfigurasyon dosyamizda <mvc:interceptors> tagini kullanmistik , AuditingInterceptor sinifini icin bean tanimini ekleyelim.

<mvc:interceptors>
 <bean id="localeChangeInterceptor"
 class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
 <property name="paramName" value="language" />
 </bean>
 
 <bean id="audit" class="_13.audit.interceptor.AuditingInterceptor"/>
</mvc:interceptors>

Ornegimizi calistiralim ;

http://localhost:8080/injavawetrust.springmvc/products/add?language=en

Sayfamizi acip bir urun ekledigimizde ilgili dizinde

audit.txt

2017-02-11 14:22:11 auditLogger : preHandle : GET request
2017-02-11 14:22:11 auditLogger : postHandle : GET request
2017-02-11 14:22:23 auditLogger : preHandle : POST request
2017-02-11 14:22:23 auditLogger : postHandle : POST request
2017-02-11 14:22:23 auditLogger : A New product[2000] Added by 0:0:0:0:0:0:0:1 on 11/02/2017 at 02:22:23

 

Github kaynak kodlar / source folder
Injavawetrust-springmvc-tutorial

Yazimi burada sonlandiriyorum.
Herkese Bol Javali Gunler dilerim.
Be an oracle man , import java.*;
Levent Erguder
OCP, Java SE 6 Programmer
OCE, Java EE 6 Web Component Developer

Print Friendly, PDF & Email

Leave a Reply

Your email address will not be published. Required fields are marked *