假设有这样的需求:将用户每次请求的ip、时间、请求、user-agent存入数据库,很明显可以用过滤器实现,在过滤器中获取到这些数据调用mybatis的mapper存入数据库,但问题来了:mybatis的映射接口规则自动生成的Dao实现类存在于Spring容器中,在filter中如何才能注入或者调用呢?

首先是web.xml配置

	<filter>
<!-- 注意下面这个过滤器名称要跟下面的spring-context.xml的相同 -->
<filter-name>myRequestLogFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
<init-param>
<param-name>targetFilterLifecycle</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>myRequestLogFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

写filter

package net.sonngdemo.wms.util;

import org.springframework.beans.factory.annotation.Autowired;

import javax.servlet.*;
import java.io.IOException; /**
* Created by Administrator on 2017/7/3.
*/ public class ReqeustFilter implements Filter { @Autowired
private RequestFilterInSpring requestFilterInSpring; /*注入下面的Spring容器中的bean,实现了具体的过滤器方法*/ @Override
public void init(FilterConfig filterConfig) throws ServletException {
} @Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
requestFilterInSpring.filter(request,response); //具体的过滤规则写在下面一个类中
chain.doFilter(request,response);
} @Override
public void destroy() { }
}

配置Spring-context.xml

<bean name="myRequestLogFilter" class="net.sonngdemo.wms.util.ReqeustFilter" ></bean>
<!-- 注意这个bean的name要跟上面的web.xml中的名称相同 -->

写一个Spring Bean,具体实现过滤器方法

package net.sonngdemo.wms.util;

import net.sonngdemo.wms.dao.RequestLogMapper;
import net.sonngdemo.wms.domain.RequestLog;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import java.util.Date; /**
* Created by Administrator on 2017/7/3.
*/
@Component("requestFilterInSpring") /*注意名称跟上面过滤器中注入的名称相同*/
public class RequestFilterInSpring {
@Autowired
private RequestLogMapper requestLogMapper; /*注入mapper实现类*/ public void filter(ServletRequest request,ServletResponse response){ /*具体实现过滤器方法*/
HttpServletRequest httpRequest=(HttpServletRequest)request;
String uri=httpRequest.getRequestURI();
String regex = "/wms/(css|errorPage|fonts|js|media)/.*";
if (!uri.matches(regex)) {
RequestLog requestLog=new RequestLog();
requestLog.setIp(request.getRemoteHost());
requestLog.setDate(new Date());
requestLog.setRequest(uri);
requestLog.setUserAgent(httpRequest.getHeader("user-agent"));
requestLogMapper.insertLog(requestLog);
}
}
}

其他mapper略

总结:

  1. web.xml中配置一个过滤器代理
  2. 写一个过滤器实现Filter接口,通过调用Spring容器中的bean来实现过滤方法
  3. 在Spring配置文件中,创建该过滤器的bean对象,注意该该bean的名称要跟web.xml中的名称相同
  4. 写一个bean,具体实现过滤方法,用@component注解

0070 过滤器调用Spring的bean操作数据库的更多相关文章

  1. 使用Spring简化JDBC操作数据库

    Spring的开发初衷是为了减轻企业级开发的复杂度,其对数据库访问的支持亦如此,使用Spring访问数据库能带来以下好处: 1.1     简化代码 使用原生的JDBC访问数据库,一般总是要执行以下步 ...

  2. 整合spring boot时操作数据库时报错Caused by: java.lang.InstantiationException: tk.mybatis.mapper.provider.base.B

    原文:https://blog.csdn.net/u__f_o/article/details/82756701 一般出现这种情况,应该是没有扫描到对应的mapper包,即在启动类下配置MapperS ...

  3. spring框架学习之--数据库操作增删改查

    基于spring的NamedParameterJdbcTemplate操作数据库 首先在 resources 文件夹下添加数据库配置文件jdbc.properties 配置常用的数据库信息 consu ...

  4. Spring入门(十五):使用Spring JDBC操作数据库

    在本系列的之前博客中,我们从没有讲解过操作数据库的方法,但是在实际的工作中,几乎所有的系统都离不开数据的持久化,所以掌握操作数据库的使用方法就非常重要. 在Spring中,操作数据库有很多种方法,我们 ...

  5. 170630、springboot编程之普通类中调用spring管理的bean对象

    我们知道如果我们要在一个类使用spring提供的bean对象,我们需要把这个类注入到spring容器中,交给spring容器进行管理,但是在实际当中,我们往往会碰到在一个普通的Java类中,想直接使用 ...

  6. Spring Boot入门系列(十四)使用JdbcTemplate操作数据库,配置多数据源!

    前面介绍了Spring Boot 中的整合Mybatis并实现增删改查.如何实现事物控制.不清楚的朋友可以看看之前的文章:https://www.cnblogs.com/zhangweizhong/c ...

  7. Spring Boot实战之数据库操作

    上篇文章中已经通过一个简单的HelloWorld程序讲解了Spring boot的基本原理和使用.本文主要讲解如何通过spring boot来访问数据库,本文会演示三种方式来访问数据库,第一种是Jdb ...

  8. Spring Boot(二):数据库操作

    本文主要讲解如何通过spring boot来访问数据库,本文会演示三种方式来访问数据库,第一种是JdbcTemplate,第二种是JPA,第三种是Mybatis.之前已经提到过,本系列会以一个博客系统 ...

  9. Spring MVC基础知识整理➣Spring+SpringMVC+Hibernate整合操作数据库

    概述 Hibernate是一款优秀的ORM框架,能够连接并操作数据库,包括保存和修改数据.Spring MVC是Java的web框架,能够将Hibernate集成进去,完成数据的CRUD.Hibern ...

随机推荐

  1. go语言基础之defer延迟调用

    1.defer作用 关键字 defer ⽤于延迟一个函数或者方法(或者当前所创建的匿名函数)的执行.注意,defer语句只能出现在函数或方法的内部. 运行场景: defer语句经常被用于处理成对的操作 ...

  2. Log4j使用指南

    1         概述 本文档是针对Log4j日志工具的使用指南.包括:日志介绍.日志工具介绍.Log4j基本使用.Log4j的高级使用.Spring与log4j的集成等.并进行了举例说明. 本文档 ...

  3. 转载 C++实现的委托机制

    转载 C++实现的委托机制 1.引言 下面的委托实现使用的MyGUI里面的委托实现,MyGUI是一款强大的GUI库,想理解更多的MyGUI信息,猛击这里http://mygui.info/ 最终的代码 ...

  4. SWFUpload 已上传成功数量控制 插件(用于解决队列满问题)

    当我们在使用 SWFUpload 做文件上传时,我们需要把已经上传的文件列表做一个删除, 但在我们把已上传列表删除后,再重新上传时,会发现提示 上传队列满 的问题,原因就是有一个状态对象中的一个 成功 ...

  5. PHP防抓取数据curl 解决方法

    1.使用Snoopy或curl传搜索引擎爬虫的USERAGENT值. 查看搜索引擎爬虫的USERAGENT值:http://www.cnblogs.com/grimm/p/5068092.html ( ...

  6. Win10系统开启Linux Bash命令行

    Win10系统开启Linux Bash命令行 导读 在Build2016上微软为了拉拢开发者发了个大招,那就是Win10一周年更新集成原生Linux Bash命令行功能,这将允许开发者或用户在Wind ...

  7. 【转】Android:最全面的 Webview 详解

    原文: https://blog.csdn.net/carson_ho/article/details/52693322 前言 现在很多App里都内置了Web网页(Hyprid App),比如说很多电 ...

  8. Cocos2d-x 2.x 升级为 3.x 常见变化纪录

    1.去CC 之前2.0的CC**,把CC都去掉,主要的元素都是保留的 2.0 CCSprite  CCCallFunc CCNode .. 3.0 Sprite CallFunc Node .. 2. ...

  9. 转:sock_ev——linux平台socket事件框架(基于数据报的测试程序) .

    上一篇已经做过注释,这一篇直接上代码 /******************************************************************************** ...

  10. 【TP3.2】模板引用头和尾.html文件

    传送门:http://document.thinkphp.cn/manual_3_2.html#include 使用模版表达式 模版表达式的定义规则为:模块@主题/控制器/操作 例如: <inc ...