如何在filter中拿到spring容器

本文详细介绍了 Origin Filter 的实现过程及其实用性,包括初始化、过滤操作和销毁方法。重点探讨了如何通过 WebApplicationContext 和 ApplicationContext 实现上下文管理。
public class OriginFilter implements Filter {

    private ServletContext servletContext;

    final private Logger logger = LoggerFactory.getLogger(getClass());

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        servletContext = filterConfig.getServletContext();
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    
        WebApplicationContext webApplicationContext = WebApplicationContextUtils.getWebApplicationContext(servletContext);
      
        ApplicationContext parent = webApplicationContext.getParent();
    
    }

    @Override
    public void destroy() {
      
    }
}
### 过滤器、拦截器与Spring容器及Servlet容器的关系 #### Servlet容器的作用 Servlet容器负责管理和调度Web应用程序中的Servlet实例。当客户端发起HTTP请求时,Servlet容器接收到该请求并将其传递给相应的Servlet进行处理。Tomcat就是一个典型的Servlet容器,它能够接收来自浏览器或其他客户端的应用层协议请求,并通过内部机制分发至对应的Servlet执行业务逻辑[^3]。 #### Spring容器的角色 Spring容器则主要承担着Bean对象的创建、配置和管理职责。在基于Spring框架构建的应用程序中,开发者定义的各种服务类和服务接口通常会被注册成为Spring Bean,而这些Bean之间的依赖关系也由Spring IoC(Inversion of Control)容器来维护。对于采用MVC架构模式设计的项目而言,DispatcherServlet作为前端控制器会先于其他任何组件被加载到内存当中,随后再依据URL映射规则寻找匹配的目标Controller及其Action方法完成视图渲染工作。 #### 过滤器的功能特性 Java Servlet过滤器是位于Servlet之前的一道屏障,它可以对进入系统的每一个HTTP请求做预处理操作,比如身份验证、日志记录或是字符编码转换等任务。由于其紧密关联着Servlet API规范,因此只有部署在支持此标准的服务端环境中才能正常运作。另外值得注意的是,Filter并不具备访问ApplicationContext的能力,默认情况下也不能直接利用Spring上下文中已有的资源来进行更复杂的业务流程控制[^2]。 ```java @WebFilter(urlPatterns = "/*") public class MyCustomFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException {} @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest)request; System.out.println("Before processing the request"); // Pass control to next element in filter chain. chain.doFilter(request,response); HttpServletResponse httpResponse=(HttpServletResponse)response; System.out.println("After processing the request"); } @Override public void destroy() {} } ``` #### 拦截器的工作原理 相比之下,Spring MVC所提供的Interceptor更加灵活多变,不仅限于Web场景下应用,甚至可以在纯Java SE环境下独立运行。借助AOP面向切面编程的思想精髓,Interceptors能够在目标Method前后插入自定义行为逻辑片段,从而达到增强原有功能的效果而不必修改原始代码结构本身。更重要之处在于,得益于Spring强大的IoC/DI特性的加持,使得Interceptor很容易就能拿到所需的一切外部协作伙伴——无论是第三方库还是自家开发的数据访问层实体都毫无压力。 ```java @Component public class LoggingInterceptor extends HandlerInterceptorAdapter { private static final Logger logger = LoggerFactory.getLogger(LoggingInterceptor.class); @Autowired private SomeService someService; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler){ String url=request.getRequestURI(); logger.info("Pre-handle URL: "+url+" with service info:"+someService.getInfo()); return true; // Continue execution... } @Override public void postHandle( HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) { // Post-processing after controller method has been invoked but before view rendering starts } @Override public void afterCompletion( HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { // Cleanup or logging activities here } } ``` #### 关键差异总结 - **适用范围**:过滤器适用于整个Web应用程序层面的所有请求路径;而拦截器仅针对特定的Handler Mapping所指定的动作方法生效。 - **依赖环境**:前者必须依附于实现了Servlet Spec的产品之上方能发挥作用;后者理论上可脱离传统意义上的服务器平台单独存在。 - **集成程度**:相较于简单的前置/后置钩子形式,拦截器拥有更高的耦合度因为它可以直接参与到Spring事务管理体系之中并与之交互共享数据状态信息。 - **灵活性对比**:虽然两者都能满足一定程度上的横切关注点分离需求,不过显然后者提供了更为丰富的扩展性和定制化选项供使用者自由发挥创意[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值