spring boot攔截器
1,在WebConfig中註冊攔截器
package com.cepht.platform.icl.config;
import org.apache.log4j.BasicConfigurator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
BasicConfigurator.configure();
registry.addViewController("/login").setViewName("login");
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
}
@Bean
public IclInterceptor myInterceptor() { //攔截器的實體類
return new IclInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) { //註冊過濾器
registry.addInterceptor(myInterceptor()).addPathPatterns("/**");
super.addInterceptors(registry);
}
}
2.實現過濾器介面
package com.cepht.platform.icl.config;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import com.cepht.platform.base.model.ilc.PgfOptLog;
import com.cepht.platform.icl.service.PgfOptLog.PgfOptLogService;
public class IclInterceptor implements HandlerInterceptor {
private Logger logger = LoggerFactory.getLogger(IclInterceptor.class);
// preHandle方法(預處理)、postHandle方法(返回處理),afterCompletion方法(後處理)。
// (1)preHandle: 在執行controller處理之前執行,返回值為boolean
// ,返回值為true時接著執行postHandle和afterCompletion,如果我們返回false則中斷執行
// (2)postHandle:在執行controller的處理後,在ModelAndView處理前執行
// (3)afterCompletion :在DispatchServlet執行完ModelAndView之後執行
@Autowired
private PgfOptLogService pgfoptlogservice;
/**
* 重寫方法 請求處理之前進行呼叫
*
* @param httpServletRequest
* @param httpServletResponse
* @param o
* @return
* @throws Exception
* @see org.springframework.web.servlet.HandlerInterceptor#preHandle(javax.servlet.http.HttpServletRequest,
* javax.servlet.http.HttpServletResponse, java.lang.Object)
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse sresponse, Object o) throws Exception {
return true;
}
/**
* 重寫方法 請求進行處理之後
*
* @param httpServletRequest
* @param httpServletResponse
* @param o
* @param modelAndView
* @throws Exception
* @see org.springframework.web.servlet.HandlerInterceptor#postHandle(javax.servlet.http.HttpServletRequest,
* javax.servlet.http.HttpServletResponse, java.lang.Object,
* org.springframework.web.servlet.ModelAndView)
*/
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o,
ModelAndView modelAndView) throws Exception {
}
/**
* 重寫方法 preHandle 方法的返回值為true 時才會執行。顧名思義,該方法將在整個請求結束之後
*
* @param httpServletRequest
* @param httpServletResponse
* @param o
* @param e
* @throws Exception
* @see org.springframework.web.servlet.HandlerInterceptor#afterCompletion(javax.servlet.http.HttpServletRequest,
* javax.servlet.http.HttpServletResponse, java.lang.Object,
* java.lang.Exception)
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse httpServletResponse, Object o,
Exception ex) throws Exception {
String url = request.getRequestURI();
if (url.startsWith("/view") || url.startsWith("/component")) {
return;
}
try {
// 插入日誌邏輯
PgfOptLog pgfOptLog = pgfoptlogservice.insertLogService(request, httpServletResponse, o, ex);
if (pgfOptLog != null) {
pgfoptlogservice.insertSelective(pgfOptLog);
}
} catch (Exception e) {
logger.debug(e.getMessage());
}
}
}