Filter 不能利用spring 注入

简介: Filter 不能利用spring 注入

Spring中,web应用启动的顺序是:listener->filter->servlet.


先初始化listener,然后再来就filter的初始化,再接着才到我们的dispathServlet的初始化,


因此,当我们需要在filter里注入一个注解的bean时,就会注入失败,


因为filter初始化时,注解的bean还没初始化,没法注入。


解决方案:


在init方法中注入


主要代码如下

package com.api.config;
import java.io.IOException;
import java.util.Date;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.http.MediaType;
import org.springframework.util.StringUtils;
import org.springframework.web.context.support.WebApplicationContextUtils;
import org.springframework.web.util.ContentCachingRequestWrapper;
import org.springframework.web.util.ContentCachingResponseWrapper;
import com.api.constant.App;
import com.api.constant.DataStatus;
import com.api.sequence.LogSequence;
import com.common.util.DateUtil;
import com.domain.UserAdCreateLog;
import com.service.UserAdCreateLogService;
public class HttpStreamFilter implements Filter {
  private final Logger logger = LoggerFactory.getLogger(this.getClass());
  private static final String REQUEST_ID = "requestId";
  @Autowired
  private UserAdCreateLogService userAdCreateLogService;
  @Override
  public void init(FilterConfig filterConfig) throws ServletException {
    ServletContext context = filterConfig.getServletContext();
    ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(context);
    userAdCreateLogService =  ctx.getBean(UserAdCreateLogService.class);
  }
  @Override
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
      throws IOException, ServletException {
    String requestId = LogSequence.get();
    MDC.put(REQUEST_ID, requestId);
    HttpServletRequest req = (HttpServletRequest) request;
        String contentType = request.getContentType();
        HttpServletResponse res = (HttpServletResponse) response;
    logger.info("request url : {}",req.getRequestURL().toString());
    logger.info("request method : {}",req.getMethod());
    logger.info("request ip : {}",request.getRemoteAddr());
        if ((contentType != null) && (contentType.indexOf(MediaType.MULTIPART_FORM_DATA_VALUE) != -1)) {
          chain.doFilter(request, response);
        } else {
            ContentCachingRequestWrapper requestWrapper = new ContentCachingRequestWrapper(req);
            ContentCachingResponseWrapper responseWrapper = new ContentCachingResponseWrapper(res);
            try {
                chain.doFilter(requestWrapper, responseWrapper);
            } finally {
                if (StringUtils.hasLength(req.getQueryString())){
                  logger.info("query String parameters : {}", req.getQueryString());
                }
                if (requestWrapper.getContentAsByteArray().length > 0) {
                  logger.info("request payload: {}", new String(requestWrapper.getContentAsByteArray()));
                }
                String responseBody = new String(responseWrapper.getContentAsByteArray());
                logger.info("http response status {}", res.getStatus());
                logger.info("response : {}", responseBody);
                if (req.getRequestURI() != null && App.USER_AD_CREATE_URIS.contains(req.getRequestURI())){
                  UserAdCreateLog userAdCreateLog = new UserAdCreateLog();
                  Date datetime = DateUtil.getServerTime();
                  userAdCreateLog.setRequestId(MDC.get(REQUEST_ID));
                  userAdCreateLog.setUrl(req.getRequestURI());
                  if (StringUtils.hasLength(req.getQueryString())){
                   userAdCreateLog.setRequest(req.getQueryString());
                  }
                  if (requestWrapper.getContentAsByteArray().length > 0) {
                    userAdCreateLog.setRequest(new String(requestWrapper.getContentAsByteArray()));
                  }
                  userAdCreateLog.setResponse(responseBody);
                  userAdCreateLog.setStatus(DataStatus.Y.getCode());
                  userAdCreateLog.setModifyTime(datetime);
                  userAdCreateLog.setCreateTime(datetime);
                  userAdCreateLogService.create(userAdCreateLog);
                }
                responseWrapper.copyBodyToResponse();
            }
        }
    MDC.remove(REQUEST_ID);
  }
  @Override
  public void destroy() {
  }
}


相关文章
|
2月前
|
XML Java 开发者
Spring Boot中的bean注入方式和原理
Spring Boot中的bean注入方式和原理
313 0
|
2月前
|
Java 程序员 Spring
Spring5深入浅出篇:Spring对象属性注入详解
Spring5深入浅出篇:Spring对象属性注入详解
|
2月前
|
XML Java 程序员
Spring6框架中依赖注入的多种方式(推荐构造器注入)
依赖注入(DI)是一种过程,对象通过构造函数参数、工厂方法的参数或在对象实例构建后设置的属性来定义它们的依赖关系(即与其一起工作的其他对象)。
41 3
|
17天前
|
Java Spring 容器
spring如何进行依赖注入,通过set方法把Dao注入到serves
spring如何进行依赖注入,通过set方法把Dao注入到serves
|
25天前
|
Java API 数据安全/隐私保护
在Spring Boot中,过滤器(Filter)是一种非常有用的组件
在Spring Boot中,过滤器(Filter)是一种非常有用的组件
37 6
|
1月前
|
Java Spring
解决 Spring 中 Prototype Bean 注入后被固定的问题
【6月更文挑战第8天】学习 Spring 框架内不原理的意义就是,当遇到问题时,分析出原因,就可以从多个切入点,利用 Spring 的特性,来解决问题。
36 2
|
1月前
spring-boot报错循环注入报错:has been injected into other beans
spring-boot报错循环注入报错:has been injected into other beans
88 3
|
18天前
|
Java Linux 程序员
技术笔记:Spring生态研习【五】:Springboot中bean的条件注入
技术笔记:Spring生态研习【五】:Springboot中bean的条件注入
|
29天前
|
SQL 安全 Java
Spring Boot中的跨站点脚本攻击(XSS)与SQL注入防护
【6月更文挑战第15天】在现代Web应用程序开发中,安全性是一个至关重要的课题。跨站点脚本攻击(XSS)和SQL注入是最常见的两种攻击类型,它们可以严重威胁到应用程序的安全。
127 0
|
2月前
|
前端开发 Java 编译器
详解Spring与JDK注入
依赖注入是Spring框架的核心概念之一,它通过将对象之间的依赖关系外部化,实现了松耦合和可测试性。面向切面编程则允许开发人员将横切关注点(如日志、事务管理)从应用程序的主要业务逻辑中分离出来,以提高代码的模块化和可维护性。
30 4