Filter cannot be injected using spring

In Spring, the order in which web applications are started is: listener->filter->servlet.

Initialize the listener first, then the filter, and then the initialization of our dispathServlet.

Therefore, when we need to inject an annotated bean in the filter, the injection will fail.

Because when the filter is initialized, the annotated bean has not been initialized and cannot be injected.

Solution:
Inject in the init method.
The main code is as follows

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() {

	}

}

Guess you like

Origin blog.csdn.net/qq_43597256/article/details/130594006