首页 > 解决方案 > @WebFilter 在使用 MockMvc 测试控制器时不起作用

问题描述

我在 MockMvc 中添加了一些过滤器以进行 junit 测试。其中一个过滤器有一个 @WebFilter 注释。它旨在拦截像“/third/*”这样的URL。但是,当我尝试访问与上述模式不匹配的 URL 时,@WebFilter 注释不起作用。

第三应用过滤器

@Component
@Order(value = 4)
@ServletComponentScan(basePackages = {"com.oppo.it.teambition.filter"})
@WebFilter(urlPatterns = { "/third/*" }, filterName = "thirdAppFilter")
@ConfigurationProperties(prefix = "whitelist")
@EnableConfigurationProperties
public class ThirdAppFilter implements Filter {

    @Autowired
    private UserService userService;

    @Autowired
    private ConfigCenter configCenter;

    private Map<String, List<String>> ip;

    @Value("${teambition.admin}")
    private String adminAccount;

    public void setIp(Map<String, List<String>> ip) {
        this.ip = ip;
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        String requestAddress = request.getHeader("x-forwarded-host");

        // 仅接受来自白名单ip的请求
        // 来自网关的请求
        List<String> gateways = configCenter.getWhitelistIpGateway() != null ? configCenter.getWhitelistIpGateway() : ip.get("gateway");
        if (!gateways.contains(requestAddress)) {
            response.sendError(HttpStatus.FORBIDDEN.value(), "访问者受限");
            return;
        }

        String appTag = request.getHeader("userId");
        String adminToken = userService.getUserToken(adminAccount, "@oppo.com");
        request.setAttribute("appTag", appTag);
        request.setAttribute("accessToken", adminToken);
        request.setAttribute("adminToken", adminToken);
        chain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void destroy() {

    }

}

模拟Mvc

@Before
public void setUp() throws Exception {
    mvc = MockMvcBuilders.webAppContextSetup(wac)
        .addFilter(advanceFilter)
        .addFilter(thirdAppFilter)
        .addFilter(idempotenceFilter)
        .addFilter(webhookFilter)
        .build();
}

标签: javaspring-boot-test

解决方案


推荐阅读