背景:
其实是要完成一个简单的调用接口的安全验证。 发现签名算法啥的好像都还相对容易,毕竟hmac 之类都封装好了,定义好规则就好。但是对于不太熟悉spring boot 拦截器 和过滤器的我来说,验证的aop编程成为一个痛点。在此简单记录下.. 毕竟我的记忆力不够好
先声明:对于我的场景来说Filter 和 Interceptor是都可以实现的。所以下面的两个方案,在功能上都可以run,但是最终选择Interceptor是更符合我的需求。
1. Filter:
核心分为两步
- STEP1 定义Filter 并实现
- STEP2 注册,在Configuration中 (毕竟spring boot 会自动加载)
1.1 Filter的定义与实现
加入maven 依赖
<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <optional>true</optional> </dependency>
实现Filter接口就行
package auth;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@WebFilter(filterName = "InternalAuth", urlPatterns = "${auth.url:/*}")
public class InternalAuthFilter implements Filter{
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest,
ServletResponse servletResponse,
FilterChain filterChain) throws IOException, ServletException {
log.debug("doFilter cvcaInternalAuth {}", servletRequest.getLocalName());
HttpServletRequest request = (HttpServletRequest) servletRequest;
// 做业务逻辑
}
@Override
public void destroy() {
}
}
1.2 Filter的Config注册
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-autoconfigure</artifactId> </dependency>
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <optional>true</optional> </dependency>
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <optional>true</optional> </dependency>
import java.util.Arrays;
import java.util.List;
import javax.servlet.Filter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
@Configuration
@ConditionalOnWebApplication
@Slf4j
public class RestAppMvcAutoConfiguration {
@Configuration
@ConditionalOnClass(Filter.class)
@ConditionalOnExpression("${auth_filter.enable:false}") // 加开关
public static class AuthFilterConfiguration {
@Bean
public AuthRegionFilter authFilterBean() {
AuthFilter filter = new AuthFilter();
log.info("service auth filter created");
return filter;
}
}
}