Springboot根据注解设置过滤器拦截请求

package com.westcredit.creditchina.security;

import com.westcredit.creditchina.security.filter.ParameterDecryptFilter;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springblade.core.api.crypto.annotation.decrypt.ApiDecrypt;
import org.springblade.core.tool.utils.Func;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.ApplicationListener;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;

import javax.servlet.Filter;
import javax.servlet.FilterRegistration;
import java.util.*;
import java.util.stream.Collectors;

@AllArgsConstructor
@Configuration
@Order()
@Slf4j
public class DecryptFilterConfiguration implements WebMvcConfigurer, ApplicationListener<ApplicationReadyEvent> {
    private final CaptionTokenProperties properties;


    @Bean
    public FilterRegistrationBean<Filter> decryptFilter() {
        FilterRegistrationBean<Filter> registration = new MyRegistrationBean<>();
        registration.setFilter(captionDecryptFilter(properties));
        registration.setOrder(Integer.MAX_VALUE);
        return registration;
    }

    @Bean
    public Filter captionDecryptFilter(CaptionTokenProperties properties) {
        return new ParameterDecryptFilter(properties);
    }

    @Override
    public void onApplicationEvent(ApplicationReadyEvent event) {
        ConfigurableApplicationContext context = event.getApplicationContext();
        MyRegistrationBean<Filter> decryptFilter = (MyRegistrationBean<Filter>) context.getBean("decryptFilter");
        RequestMappingHandlerMapping mapping = context.getBean(RequestMappingHandlerMapping.class);
        Map<RequestMappingInfo, HandlerMethod> map = mapping.getHandlerMethods();

        Collection<String> urlPatterns = map.entrySet().stream().filter(entry -> {
                    HandlerMethod method = entry.getValue();
                    ApiDecrypt decrypt = method.getBeanType().getAnnotation(ApiDecrypt.class);
                    if (decrypt == null) {
                        decrypt = method.getMethodAnnotation(ApiDecrypt.class);
                    }
                    return decrypt != null;
                }).map(entry -> entry.getKey().getPatternsCondition().getPatterns())
                .flatMap(Collection::stream)
                .filter(Func::isNotBlank)
                .map(url -> url.replaceAll("(?<=\\{)(.+?)(?=})", "*").replaceAll("\\{\\*}", "*"))
                .collect(Collectors.toList());
        decryptFilter.setUrlPatterns(urlPatterns);
        decryptFilter.afterPropertiesSet();
    }

    private class MyRegistrationBean<T extends Filter> extends FilterRegistrationBean<T> {

        private FilterRegistration.Dynamic registration;

        @Override
        protected void configure(FilterRegistration.Dynamic registration) {
            this.registration = registration;
        }

        public void afterPropertiesSet() {
            setMatchAfter(false);
            super.configure(registration);
        }
    }

}
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值