SpringBoot實現Interceptor攔截器打印請求信息
配置類
實現WebMvcConfigurer 中的addInterceptors接口,註冊Interceptor攔截器。這裏靜態資源要把項目中用到的全部類型釋放,不然加載頁面會出現錯誤的。
package com.example.demo.Interceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
//註冊Interceptor攔截器
InterceptorRegistration registration = registry.addInterceptor(new Interceptor());
//攔截div接口。(/**表示攔截所有請求)
registration.addPathPatterns(
"/div"
);
//添加不攔截路徑
registration.excludePathPatterns(
"/**/login", //登錄
"/**/*.html", //html靜態資源
"/**/*.js", //js靜態資源
"/**/*.css", //css靜態資源
"/**/*.woff",
"/**/*.ttf",
"/**/*.jpg",
"/**/*.png",
"/**/*.gif",
"/**/*.ico",
"/**/*.eot",
"/**/*.svg"
);
}
}
攔截類
在攔截器中打印請求信息
package com.example.demo.Interceptor;
import cn.hutool.json.JSONObject;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Enumeration;
public class Interceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
StringBuilder sb = new StringBuilder(1000);
String url =request.getRequestURL().toString();
if(!url.contains(".css") && !url.contains(".js") && !url.contains(".png") && !url.contains(".jpg")) {
System.out.println("*******************訪問地址:"+url+"*******************");
System.out.println("*******************客戶端請求地址和操作端口:" + request.getRemoteAddr() + ":" + request.getRemotePort() + "*******************");
}
//獲取請求參數
Enumeration em = request.getParameterNames();
JSONObject data = new JSONObject();
while (em.hasMoreElements()) {
String name = (String) em.nextElement();
String value = request.getParameter(name);
data.put(name,value);
}
sb .append("-------------------------------------------------------------\n");
HandlerMethod h = (HandlerMethod) handler;
sb.append("Controller: ").append(h.getBean().getClass().getName()).append("\n");
sb.append("Method : ").append(h.getMethod().getName()).append("\n");
sb.append("Params : ").append(data).append("\n");
sb.append("URI : ").append(request.getRequestURI()).append("\n");
sb.append("URL : ").append(request.getRequestURL()).append("\n");
sb .append("-------------------------------------------------------------\n");
System.out.println(sb.toString());
return true;
}
}
其中:入參:Object handler,原來爲Object args2,將args2改爲handler即可。
測試接口
攔截的就是下面這個div接口。
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class TestController {
@GetMapping("/test")
@ResponseBody
public int test(int x,int y ){
return x/y;
}
}
控制檯打印結果
*******************訪問地址:http://192.168.x.xxx:8081/test*******************
*******************客戶端請求地址和操作端口:192.168.x.xxx:53137*******************
-------------------------------------------------------------
Controller: com.example.demo.controller.TestController
Method : test
Params : {"x":"10","y":"5"}
URI : /test
URL : http://192.168.x.xxx:8081/test
-------------------------------------------------------------