springboot中 拦截器无法访问数据库解决方法

在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;

		}

}

这样就解决了问题

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值