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

2023-10-28

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

		}

}

这样就解决了问题

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

springboot中 拦截器无法访问数据库解决方法 的相关文章

随机推荐

  • 计算机中丢失MSVCR120.dll,电脑找不到MSVCR120.dll怎么办

    在电脑打开浏览器后在顶部栏目搜索或许点击这里传送门 dll修复程序 site 按下回车键然后进入下载msvcp120 dll系统文件 1 然后再打开解压好的文件 打开后点击开始安装电脑丢失的msvcp120 dll文件 2 开始快速的进行相
  • 半监督目标检测(三)

    目录 ISMT 动机 1 Overview 2 Pseudo Labels Fusion 3 Interactive Self Training 4 Mean Teacher Unbiased Teacher 动机 1 Overview 2
  • H5使用hook实现网络连接情况判断

    最近使用hook写了一个小练习 作用就是判断网络的连接情况 并在连接情况变化的时候可以作出一系列的操作 话不多说 上代码 function useCheckOnline navigator onLine代表当前的网络连接情况 const o
  • 第六课:MAC去中心化钱包开发之备份私钥

    一 私钥 这节课继续将注册Token后的步骤 就是备份私钥 每个公链都会有私钥 但是不尽相同 MAC底层的私钥比较多 有4个 分别是 钱包钥匙 钱包钥匙是开启MAC钱包的必备信息之一 格式为mac三个字母开头的一长串字符 创建钱包账户后会提
  • 新人小白求助大佬

    本人在进行病例对照匹配 想要匹配比是1 2 匹配条件是年龄 3岁 孕周 3周 我之前用的R语言代码是MatchIt代码 代码如下 这个代码有两个问题 一个是匹配方法 method 中没有范围的选项 只能按照 nearest 或者 exact
  • Ubuntu18.04中修改Ubuntu的外观(菜单栏放到屏幕下方)

    因为用的synergy分屏使用 所以想要将Ubuntu18 04的左侧栏放到屏幕底部 因为鼠标在点击左侧另一个电脑侧边栏的时候会不小心点到 过程 安装gnome tweak tool感觉是最方便的 直接打开命令行 先安装配置工具 sudo
  • 第三回:布局格式定方圆

    文章目录 第三回 布局格式定方圆 一 子图 1 使用 plt subplots 绘制均匀状态下的子图 2 使用 GridSpec 绘制非均匀子图 二 子图上的方法 思考题 第三回 布局格式定方圆 import numpy as np imp
  • Vuejs实践--事件绑定

    Vue中的事件绑定一般通过v on指令来绑定事件 事件绑定 v on 事件绑定的表达式的值可以是js语句 也可以是在methods选项中定义好的方法名 有参数的时候当然需要传参 在vue事件中 如果要用到事件对象e 要将e作为形参传入函数
  • SpringBoot 之 MDC 实现全链路调用日志跟踪

    文章目录 日志拦截器 修改日志格式 trackId 丢失解决 日志拦截器 import com evcas charge pile platform common annotation LogNoTrace import com evcas
  • STM32 基础系列教程 18 – IWDG

    前言 学习stm32 独立看门狗 IWDG 接口使用 学会用STM32内部独立看门狗 IWDG 实现程序异常时自复位功能 STM32F10xxx内置两个看门狗 提供了更高的安全性 时间的精确性和使用的灵活性 两个看门狗设备 独立看门狗和窗口
  • 计算机网络——SOCKET、TCP、HTTP之间的区别与联系

    文章目录 一 Socket 1 什么是socket 2 为什么需要socket 3 建立socket连接 4 socket分类 二 HTTP 基于TCP 1 HTTP的概念 2 HTTP连接的特点 2 1 连接请求 一次连接 2 2 连接请
  • 专栏《乔新亮的CTO成长复盘》读书笔记(技术架构篇)

    架构决策能力不但非常关键 而且是技术管理者最重要的能力和职责之一 而且职级越高就越重要 很多所谓的 技术债 也就是由一次次的决策失误不断累加而成的 管理者要能充分利用自己的技术视野和业务认知提前做好预判和布局 也就是上医治未病 做 T 型人
  • 滑动谜题 -- BFS

    滑动谜题 输入 board 4 1 2 5 0 3 输出 5 解释 最少完成谜板的最少移动次数是 5 一种移动路径 尚未移动 4 1 2 5 0 3 移动 1 次 4 1 2 0 5 3 移动 2 次 0 1 2 4 5 3 移动 3 次
  • Python Selenium 基本使用(详细步骤)

    一 简介 Selenium 是一个 web 应用程序自动化测试工具 对各种浏览器都能很好地支持 包括 Chrome Firefox 这些主流浏览器 使用它可以模拟浏览器进行各种各样的操作 包括爬取一些网页内容 当看到浏览器自己运行并且在网页
  • QtConcurrent 线程使用说明

    关于Qt Concurrent 我们首先来看看Qt Assitant是怎么描述的 The QtConcurrent namespace provides high level APIs that make it possible to wr
  • 关于UE4 vs2017 SpawnActor编译通过,调试运行崩溃的问题

    在制作VR模式代码编写的时候 使用一些API采用UWorld SpawnActor的时候出现代码编译编译通过无报错 但是调试运行失败的原因 找了很久才找到原因 原来是构造器的问题 就是把SpawnActor放到到BeginPlay 中 不能
  • oracle全文索引之commit与DML操作

    我们知道 无论对多大的数据做DML操作 执行commit都可以很快完成 但如何删除建有全文索引的记录 在commit时可能会很慢 根据推断可以知道是由于域索引造成的 那么在有域索引的情况下 commit时 oracle还做了那些额外工作呢
  • chatgpt赋能python:Python求全排列的介绍

    Python求全排列的介绍 在计算机科学中 全排列是一种排列的形式 将一组元素按照固定的顺序安排 在Python中 可以使用递归和迭代来求解全排列问题 本文将介绍如何用Python求全排列以及如何在SEO方面优化文章 递归方法 递归方法是通
  • 新形势下,企业如何进行数字化转型 附下载地址

    2020年谈企业数字化转型 有一个不变和四个变 不变的是企业面临的整体宏观环境和企业 多年发展积累的运营模式和管理能力 因此企业数字化转型面临的固有难点依然存在 四个 变化因素是疫情影响 5G部署 人工智能 AI 加快应用 以及中美技术加速
  • springboot中 拦截器无法访问数据库解决方法

    在springboot中使用拦截器时 拦截器中还需要访问数据库 会出现实例化数据库访问对象失败的现象 不管是添加 Componse还是添加 Servie 或者 Configuration 均不可以 需要做如下处理 方法如下 1 在集成Web