在springboot中使用拦截器时,拦截器中还需要访问数据库,会出现实例化数据库访问对象失败的现象,不管是添加@Componse还是添加@Servie 或者@Configuration 均不可以,需要做如下处理,方法如下:
1.在集成WebMvcConfigurerAdapter的方法中进行修改:
@Configuration
public class FilterConfig extends WebMvcConfigurerAdapter{
@Autowired
private SysLogImpl logImpl;
@Override
public void addInterceptors(InterceptorRegistry registry) {
// TODO Auto-generated method stub
System.out.println("开始要进入到拦截了!");
registry.addInterceptor(new MyInterceptor(logImpl)).addPathPatterns("/**");
super.addInterceptors(registry);
}
// @Bean
// public FilterRegistrationBean registFilter() {
// System.out.println("开始要进入到过滤了!");
// FilterRegistrationBean registration = new FilterRegistrationBean();
// registration.setFilter(new MyFilter());
// registration.addUrlPatterns("/*");
// registration.setName("MyFilter");
// registration.setOrder(1);
// return registration;
// }
}
2.在具体的方法里实现自己有参数的构造方法即可
package io.swagger.configuration;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.util.HashMap;
import java.util.Map;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.HandlerMapping;
import org.springframework.web.servlet.ModelAndView;
@Component
public class MyInterceptor implements HandlerInterceptor {
long start = System.currentTimeMillis();
public SysLogImpl logImpl;
public MyInterceptor(SysLogImpl logImpl) {
// TODO Auto-generated constructor stub
super();
this.logImpl = logImpl;
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// TODO Auto-generated method stub
System.out.println("preHander被调用");
/**
Map map = (Map) request.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);
System.out.println("name's value is:"+map.get("name"));
if(map.get("name").equals("zhangsan")) {
return true;
}else {
PrintWriter printWriter = response.getWriter();
printWriter.write("please login again!");
return false;
}
**/
start = System.currentTimeMillis();
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// TODO Auto-generated method stub
System.out.println("postHandler被调用");
//String tokenStr = request.getHeader("token");
Map map = TokenForUserInfor.deCodeToken(request);
String userName = (String) map.get("userName");
System.out.println("current userName is:"+userName);
String url = request.getRequestURI();
String method = request.getMethod().toLowerCase();
System.out.println("current url is:"+url+" method is:"+method);
String clientIp = getIpAddress(request);
System.out.println("current clientIp is:"+clientIp);
String menu = logImpl.menuName(url, method);
System.out.println("menu name is:"+menu);
System.out.println("Interceptor cost="+(System.currentTimeMillis()-start));
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// TODO Auto-generated method stub
System.out.println("afterCompletion被调用");
}
// 获取客户端IP地址
private static String getIpAddress(HttpServletRequest request) {
String ip = request.getHeader("x-forwarded-for");
if (ip == null || ip.length() == 0 || "unknow".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
if (ip.equals("127.0.0.1")) {
// 根据网卡取本机配置的IP
InetAddress inet = null;
try {
inet = InetAddress.getLocalHost();
} catch (Exception e) {
e.printStackTrace();
}
ip = inet.getHostAddress();
}
}
// 多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割
if (ip != null && ip.length() > 15) {
if (ip.indexOf(",") > 0) {
ip = ip.substring(0, ip.indexOf(","));
}
}
return ip;
}
}
这样就解决了问题