假设有这样的需求:将用户每次请求的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. C++中函数调用时的三种参数传递方式详解

    在C++中,参数传递的方式是“实虚结合”. 按值传递(pass by value) 地址传递(pass by pointer) 引用传递(pass by reference) 按值传递的过程为:首先计 ...

  2. Orchard运用 - 如何隐藏去除某些Meta标记

    众所周知,每个系统多多少少都会有一些痕迹或标记之类的东西, 比如默认的Orchard搭建的网站, 如果你查看源代码即可看到类似的代码: <meta content="Orchard&q ...

  3. 魔术布局效果-使用本地JSON数据提供数据服务

    在线演示 有社区朋友不知道如何修改外部OpenAPI为本地的JSON服务,这里做一个简单演示. 阅读原文:魔术布局效果-使用本地JSON数据提供数据服务

  4. android开发之MediaPlayer+Service MP3播放器

    import java.io.File; import java.io.FilenameFilter; import java.util.ArrayList; import java.util.Lis ...

  5. ES PS TS 流的区别

    http://fengqing888.blog.163.com/blog/static/330114162012111805717584/ ES是原始码流,包含视频.音频或数据的连续码流.TS是传输流 ...

  6. 在Flex (Flash)中嵌入HTML 代码或页面—Flex IFrame

    在flex组件中嵌入html代码,可以利用flex iframe.这个在很多时候会用到的,有时候flex必须得这样做,如果你不这样做还真不行…… flex而且可以和html进行JavaScript交互 ...

  7. Python 面向对象编程 继承 和多态

    Python 面向对象编程 继承 和多态 一:多继承性 对于java我们熟悉的是一个类只能继承一个父类:但是对于C++ 一个子类可以有多个父亲,同样对于 Python一个类也可以有多个父亲 格式: c ...

  8. LInux下inode空间报警-CROND出错导致/var/spool/postfix/maildrop/堆积

    Linux下显示磁盘空间不足,,通过 df -ih 查询发现/dev/mapper/*****var 下的inode用满.inode介绍 通过 du -sh * 查询/目录下的问题,最终查到/var/ ...

  9. oracle的check约束

    check约束是指检查性约束,使用check约束时.将对输入的每个数据进行检查,仅仅有符合条件的记录才会被保存到表中,从而保证了数据的有效性和完整性.      check约束既有下面的四个特点: 在 ...

  10. Unix 网络编程 I/O 模型 第六章

    前提,也是重点是, 当接收收据.或者读取数据时,分两步 1 等待数据准备好. 2 从内核拷贝数据到进程. 对于一个network IO 即 socket(这里我们以read举例),它会涉及到两个系统对 ...