在Servlet Filter中使用Spring容器

定义一个filter, 实现ApplicationContextAware接口:

public class CacheFilter implements Filter, ApplicationContextAware {
    private static ApplicationContext ctx; // 必须声明为static

    @Override
    public void init(FilterConfig config) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

        filterChain.doFilter(servletRequest, servletResponse);

    }

    @Override
    public void destroy() {

    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        CacheFilter.ctx = applicationContext; // 保存spring容器到static变量中
    }

然后,在spring配置文件中配置该filter,使之成为容器管理的bean:

<beans:bean id="cacheFilter" class="com.fh.taolijie.servlet.CacheFilter" />

最后,在web.xml中声明过滤器:

<filter>
        <filter-name>Cache Filter</filter-name>
        <filter-class>com.fh.taolijie.servlet.CacheFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>Cache Filter</filter-name>
        <servlet-name>appServlet</servlet-name>
    </filter-mapping>

这时,我们就可以在doFilter()方法中直接通过ApplicationContext检索需要的bean了:

StringRedisTemplate redis = (StringRedisTemplate)ctx.getBean("redisTemplate");
时间: 2024-10-11 22:49:30

在Servlet Filter中使用Spring容器的相关文章

Spring--------web应用中保存spring容器

---恢复内容开始--- 问题:在一个web应用中我使用了spring框架,但有一部分模块或组件并没有托管给Spring,比如有的可能是一个webservice服务类,如果我想在这些非托管的类里使用托管对象该怎么办呢,很自然的我们需要获得spring容器对象的引用ApplicationContext,我的想法是在服务启动后,想办法将ApplicationContext容器的应用保存到一个静态变量中,以后使用就简单了. 1)刚开始用的是spring+struts2,实力话spring用的是Cont

JSP中Filter中访问Spring管理的beans

@Override public void init(FilterConfig filterConfig) {  //unchecked = filterConfig.getInitParameter("unchecked").split(",");  WebApplicationContext wc = WebApplicationContextUtils.getWebApplicationContext(filterConfig.getServletContex

在listener或者工具中使用spring容器中的bean实例

在项目中经常遇见需要在Listener中或者工具中使用Spring容器中的bean实例,由于bean不能在stataic的类中使用. 介绍一种方式: public class SpringTool { public static Object getObjectFromApplication(HttpSession session,String beanName){ ServletContext servletContext= session.getServletContext(); //通过W

Servlet Filter 中init和destroy问题

测试源码如下: 1 package com.FilterTest.Filter; 2 3 import java.io.IOException; 4 5 import javax.servlet.Filter; 6 import javax.servlet.FilterChain; 7 import javax.servlet.FilterConfig; 8 import javax.servlet.ServletException; 9 import javax.servlet.Servlet

如何在Struts2的拦截器中调用Spring容器

第一种: 通常用ApplicationContext来调用Spring配置文件中的一些Bean,所以首先创建Spring上下文容器. ApplicationContext ac = (ApplicationContext) invocation.getInvocationContext().getApplication().get(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE); 以上代码中invocation是Stru

在Struts等框架中获取Spring容器的方式

WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(ServletContext src); WebApplicationContext 拓展了ApplicationContext Web程序启动时,Spring实例会以某个键存放在ServletContext属性列表中

获取Application中的spring容器

方式1: ApplicationContext ac = (ApplicationContext) invocation.getInvocationContext().getApplication().get(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE); 方式2: ServletContext sc = ServletActionContext.getServletContext(); ApplicationCont

非spring组件servlet、filter、interceptor中注入spring bean

问题:在filter和interceptor中经常需要调用Spring的bean,filter也是配置在web.xml中的,请问一下这样调用的话,filter中调用Spring的某个bean,这个bean一定存在吗?现在总是担心filter调用bean的时候,bean还没被实例化? 答案:因为spring bean.filter.interceptor加载顺序与它们在 web.xml 文件中的先后顺序无关.即不会因为 filter 写在 listener 的前面而会先加载 filter.最终得出

Spring Boot 2 实战:如何自定义 Servlet Filter

1.前言 有些时候我们需要在 Spring Boot Servlet Web 应用中声明一些自定义的 Servlet Filter 来处理一些逻辑.比如简单的权限系统.请求头过滤.防止 XSS 攻击等.本篇将讲解如何在 Spring Boot 应用中声明自定义 Servlet Filter 以及定义它们各自的作用域和顺序. 2. 自定义 Filter 可能有人说声明 Servlet Filter 不就是实现 Filter 接口嘛,没有什么好讲的!是的这个没错,但是很多时候我们并不想我们声明的 F