Spring Boot配置过滤器的两种方式

  过滤器(Filter)是Servlet中常用的技术,可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截,常用的场景有登录校验、权限控制、敏感词过滤等,下面介绍下Spring Boot配置过滤器的两种方式。
  
  本文目录
  
  一、@WebFilter注解方式
  
  二、@Bean注解方式
  
  三、查看运行效果
  
  一、@WebFilter注解方式
  
  使用@WebFilter注解为声明当前类为filter,第一个参数为该filter起一个名字,第二个参数为说明要拦截的请求地址,当前类需要实现Filter接口,里面有三个方法,分别为过滤器初始化、过滤方法和过滤器销毁。
  
  @Slf4j
  
  @WebFilter(filterName = "myFilter1", urlPatterns = "/*")
  
  public class MyFilter1 implements Filter {
  
  @Override
  
  public void init(FilterConfig filterConfig) throws ServletException {
  
  log.info(filterConfig.getFilterName() + " init");
  
  }
  
  @Override
  
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
  
  log.info("myFilter1 begin");
  
  try {
  
  log.info("业务方法执行");
  
  chain.doFilter(request, response);
  
  } catch (Exception e) {
  
  log.error("error!", e);
  
  }
  
  log.info("myFilter1 end");
  
  }
  
  @Override
  
  public void destroy() {
  
  }
  
  }
  
  启动类添加@ServletComponentScan注解,@ServletComponentScan注解所扫描的包路径必须包含该Filter,代码如下:
  
  @SpringBootApplication
  
  @ServletComponentScan(basePackages = "com.example.demo.filter")
  
  public class DemoApplication {
  
  public static void main(String[] args) {
  
  SpringApplication.run(DemoApplication.class, args);
  
  }
  
  }
  
  二、@Bean注解方式
  
  新建MyFilter2.java类,不要加注解@WebFilter,代码如下:
  
  @Slf4j
  
  public class MyFilter2 implements Filter {
  
  @Override
  
  public void init(FilterConfig filterConfig) throws ServletException {
  
  log.info(filterConfig.getFilterName() + " init");
  
  }
  
  @Override
  
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
  
  log.info("myFilter2 begin");
  
  try {
  
  log.info("业务方法执行");
  
  chain.doFilter(request, response);
  
  } catch (Exception e) {
  
  log.error("error!", e);
  
  }
  
  log.info("myFilter2 end");
  
  }
  
  @Override
  
  public void destroy() {
  
  }
  
  }
  
  新建配置类WebConfig.java,配置bean,代码如下:
  
  @Configuration
  
  public class WebConfig {
  
  @Bean
  
  public FilterRegistrationBean testFilterRegistration() {
  
  FilterRegistrationBean registration = new FilterRegistrationBean(new MyFilter2());
  
  registration.addUrlPatterns("/test"); //
  
  registration.setName("myFilter2");
  
  return registration;
  
  }
  
  }
  
  三、查看运行效果
  
  项目启动后浏览器访问http://localhost:8080/test,可以看到过滤器已生效,后台打印日志如下:
  
  [nio-8080-exec-1] com.example.demo.filter.MyFilter1        : myFilter1 begin
  
  [nio-8080-exec-1] com.example.demo.filter.MyFilter1        : 业务方法执行
  
  [nio-8080-exec-1] com.example.demo.filter.MyFilter1        : myFilter1 end
  
  到此Spring Boot配置过滤器的两种方式已经全部实现,有问题欢迎留言沟通哦!
  
  完整源码地址: https://github.com/suisui2019/springboot-study
  
  推荐阅读
  
  1.Spring Boot统一异常处理实战
  
  2.从技术的角度分析下为什么不要在网上发“原图”
  
  3.利用Spring Boot+zxing,生成二维码还能这么简单
  
  4.Spring Boot之Profile--快速搞定多环境使用与切换
  
  5.利用Spring Boot+WxJava实现网站集成微信登录功能
  
  限时领取免费Java相关资料,涵盖了Java、Redis、MongoDB、MySQL、Zookeeper、Spring Cloud、Dubbo/Kafka、Hadoop、Hbase、Flink等高并发分布式、大数据、机器学习等技术。
  
  关注下方公众号即可免费领取:
  
  --namespace=default
  
  rolebinding.rbac.authorization.k8s.io/default-view created
  
  以上命令将默认service account与集群角色视图相关联,该角色视图使pod能够列出资源。
  
  如果你十分好奇,想看所有可用的集群角色,运行命令:kubectl get clusterroles。
  
  让我们再次启动BusyBox pod并且访问API Server。
  
  kubectl run -i --tty --rm curl-tns --image=radial/busyboxplus:curl
  
  kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
  
  If you don't see a command prompt, try pressing enter.
  
  [ root@curl-tns-56c6d54585-2cx44:/ ]$
  
  CA_CERT=/var/run/secrets/kubernetes.io/serviceaccount/ca.crt
  
  TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
  
  NAMESPACE=$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace)
  
  curl --cacert $CA_CERT -H www.shenzhenztgs.com"Authorization: Bearer $TOKEN" "https://kubernetes/api/v1/namespaces/$NAMESPACE/services/"
  
  {
  
  "kind": "ServiceList",
  
  "apiVersion": "v1",
  
  "metadata": {
  
  "selfLink": "/api/v1/namespaces/default/services/",
  
  "resourceVersion": "11076"
  
  },
  
  "items": [
  
  {
  
  "metadata": {
  
  "name": "kubernetes",
  
  "namespace": "default",
  
  "selfLink": "/api/v1/namespaces/default/services/kubernetes",
  
  "uid": "b715a117-6be1-4de0-8830-45bddcda701c",
  
  "resourceVersion": "151",
  
  "creationTimestamp": "2019-08-13T09:45:27Z",
  
  "labels": {
  
  "component": "apiserver",
  
  "provider": "kubernetes"
  
  }
  
  },
  
  "spec": {
  
  "ports": [
  
  {
  
  "name": "https",
  
  "protocol": "TCP",
  
  "port": 443,
  
  "targetPort": 8443
  
  }
  
  ],
  
  "clusterIP": "10.96.0.1",
  
  "type": "ClusterIP",
  
  "sessionAffinity": "None"
  
  },
  
  "status": {
  
  "loadBalancer": {
  
  }
  
  }
  
  }
  
  ]
  
  }
  
  您可以随意为默认service account创建其他绑定,以检查RBAC如何扩展到pod。
  
  关于Kubernetes身份认证与授权系列文章到此结束,我们讨论了身份验证,授权和Service account的基本概念,希望能对你有所帮助。

你可能感兴趣的:(Spring Boot配置过滤器的两种方式)