Filter

Filter要使请求继续被处理,就一定要显示调用filterChain.doFilter()

自定义Filter,@WebFilter形式
@WebFilter形式控制不了多个过滤器之间的执行顺序,默认是按照class名字首字母的ASCII的字母排序.
并且需要在启动类上加上@ServletComponentScan扫描过滤器

package com.fchan.espractice.filter;import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;@WebFilter(filterName = "tokenFilter", urlPatterns = "/testMybatisTrsanctional/*")
public class TokenFilter implements Filter, ApplicationContextAware {private ApplicationContext applicationContext;@Autowiredprivate ObjectMapper objectMapper;@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest)servletRequest;String token = request.getHeader("token");if(!StringUtils.isEmpty(token)){filterChain.doFilter(servletRequest, servletResponse);}HttpServletResponse response = (HttpServletResponse) servletResponse;response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);response.setContentType(MediaType.APPLICATION_JSON_UTF8_VALUE);Map<String,Object> map = new HashMap<>();map.put("name","李四");ServletOutputStream outputStream = response.getOutputStream();outputStream.write(objectMapper.writeValueAsBytes(map));outputStream.close();}@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext = applicationContext;}
}

启动类加上扫描注解

package com.fchan.espractice;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.context.annotation.Bean;
import org.springframework.transaction.PlatformTransactionManager;@SpringBootApplication
@MapperScan("com.fchan.espractice.dao")
//ServletComponentScan扫描自定义Filter,可以指定包路径
@ServletComponentScan
public class EsPracticeApplication {@Beanpublic Object testBean(PlatformTransactionManager platformTransactionManager){System.out.println(">>>>>>>>>>" + platformTransactionManager.getClass().getName());return new Object();}public static void main(String[] args) {SpringApplication.run(EsPracticeApplication.class, args);}}

过滤器方式2,自定义执行顺序

自定义的2个过滤器

package com.fchan.espractice.filter;import lombok.extern.slf4j.Slf4j;import javax.servlet.*;
import java.io.IOException;@Slf4j
public class TestFilter implements Filter {@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {log.info("TestFilter.doFilter");filterChain.doFilter(servletRequest, servletResponse);}
}
package com.fchan.espractice.filter;import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.util.StringUtils;import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;public class TokenFilter implements Filter, ApplicationContextAware {private ApplicationContext applicationContext;@Autowiredprivate ObjectMapper objectMapper;@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest)servletRequest;String token = request.getHeader("token");if(!StringUtils.isEmpty(token)){filterChain.doFilter(servletRequest, servletResponse);}HttpServletResponse response = (HttpServletResponse) servletResponse;response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);response.setContentType(MediaType.APPLICATION_JSON_UTF8_VALUE);Map<String,Object> map = new HashMap<>();map.put("name","李四");ServletOutputStream outputStream = response.getOutputStream();outputStream.write(objectMapper.writeValueAsBytes(map));outputStream.close();}@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext = applicationContext;}
}

配置2个过滤器

多个过滤器之间order数值小的执行顺序优先

package com.fchan.espractice.filter.config;import com.fchan.espractice.filter.TestFilter;
import com.fchan.espractice.filter.TokenFilter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class MyFilterConfig {@Beanpublic TestFilter testFilter(){return new TestFilter();}@Beanpublic TokenFilter tokenFilter(){return new TokenFilter();}@Beanpublic FilterRegistrationBean<TestFilter> TestFilterFilterRegistrationBean(@Autowired TestFilter testFilter){FilterRegistrationBean<TestFilter> filterRegistrationBean = new FilterRegistrationBean<>();filterRegistrationBean.setFilter(testFilter);filterRegistrationBean.addUrlPatterns("/*");//order数值小的顺序优先filterRegistrationBean.setOrder(2);return filterRegistrationBean;}@Beanpublic FilterRegistrationBean<TokenFilter> TokenFilterFilterRegistrationBean(@Autowired TokenFilter tokenFilter){FilterRegistrationBean<TokenFilter> filterRegistrationBean = new FilterRegistrationBean<>();filterRegistrationBean.setFilter(tokenFilter);filterRegistrationBean.addUrlPatterns("/*");filterRegistrationBean.setOrder(3);return filterRegistrationBean;}
}

SpringmvcHandlerInterceptorAdapter拦截器

HandlerInterceptorAdapter中主要提供了以下的方法:

  • preHandle:在方法被调用前执行。在该方法中可以做类似校验的功能。如果返回true,则继续调用下一个拦截器。如果返回false,则中断执行,也就是说我们想调用的方法不会被执行,但是你可以修改response为你想要的响应。
  • postHandle:在方法执行后调用。
  • afterCompletion:在整个请求处理完毕后进行回调,也就是说视图渲染完毕或者调用方已经拿到响应。

自定义拦截器

package com.fchan.espractice.intercept;import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;@Component
public class GlobalIntercept extends HandlerInterceptorAdapter {@Autowiredprivate ObjectMapper objectMapper;public GlobalIntercept() {super();}/*** false拦截* true放行* @param request* @param response* @param handler* @return* @throws Exception*/@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {String token = request.getHeader("token");if(!StringUtils.isEmpty(token)){return true;}response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);response.setContentType(MediaType.APPLICATION_JSON_UTF8_VALUE);Map<String,Object> map = new HashMap();map.put("name","张三");ServletOutputStream outputStream = response.getOutputStream();outputStream.write(objectMapper.writeValueAsBytes(map));outputStream.close();return false;}}

配置拦截器,及顺序说明
多个拦截器的话按照
registry.addInterceptor
的添加顺序来执行

package com.fchan.espractice.intercept.config;import com.fchan.espractice.intercept.GlobalIntercept;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class InterceptConfig implements WebMvcConfigurer, ApplicationContextAware {private ApplicationContext applicationContext;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(applicationContext.getBean(GlobalIntercept.class));}@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext = applicationContext;}
}

SpringGenericFilterBean过滤器

org.springframework.web.filter.GenericFilterBeanspringServeletFilter的实现,我们继承GenericFilterBean后可以将ServeletFilter纳入spring的容器中作为bean;

@Order(-999)数值越小执行优先级越高

自定义的过滤器

package com.fchan.espractice.filter;import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.annotation.Order;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.filter.GenericFilterBean;import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;@Component
@Order(-999)
public class MySpringFilter extends GenericFilterBean {@Autowiredprivate ObjectMapper objectMapper;@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest)servletRequest;String token = request.getHeader("token");if(!StringUtils.isEmpty(token)){filterChain.doFilter(servletRequest, servletResponse);}HttpServletResponse response = (HttpServletResponse) servletResponse;response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);response.setContentType(MediaType.APPLICATION_JSON_UTF8_VALUE);Map<String,Object> map = new HashMap<>();map.put("name","李四");ServletOutputStream outputStream = response.getOutputStream();outputStream.write(objectMapper.writeValueAsBytes(map));outputStream.close();}
}

springboot下的Filter过滤器;springmvc的HandlerInterceptorAdapter拦截器;Spring的GenericFilterBean过滤器相关推荐

  1. Springmvc中的拦截器interceptor及与过滤器filter的区别

    一.Springmvc中的拦截器概述及与过滤器filter的区别 1).Springmvc中的拦截器interceptor用于对控制器controller进行预处理和后处理的技术; 2).可以定义拦截 ...

  2. springBoot的过滤器,监听器,拦截器

    概述 在开发中,我们经常要考虑一些问题,对敏感词进行过滤,用户是否已经登录,是否需要对他的请求进行拦截,或者领导问现在在线人数有多少人?我们如何实现这些功能哪 @WebFilterpackage co ...

  3. SpringMVC中的拦截器、过滤器的区别、处理异常

    SpringMVC中的拦截器.过滤器的区别.处理异常 参考文章: (1)SpringMVC中的拦截器.过滤器的区别.处理异常 (2)https://www.cnblogs.com/ahaijava/p ...

  4. 【SpringMVC笔记】拦截器 + 文件上传下载

    拦截器 + 文件上传下载 拦截器(interceptor) 自定义拦截器 验证用户是否登录 (认证用户) 没有拦截器 配置拦截器 文件的上传 文件输出流进行文件上传 file.Transto 进行文件 ...

  5. SpringMVC中的拦截器

    SpringMVC中的拦截器 拦截器的作用 Spring MVC 的处理器拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理. 用户可以自己定义一些拦截器来实现 ...

  6. (转)SpringMVC学习(十二)——SpringMVC中的拦截器

    http://blog.csdn.net/yerenyuan_pku/article/details/72567761 SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter, ...

  7. 【SpringMVC学习11】SpringMVC中的拦截器

    Springmvc的处理器拦截器类似于Servlet 开发中的过滤器Filter,用于对处理器进行预处理和后处理.本文主要总结一下springmvc中拦截器是如何定义的,以及测试拦截器的执行情况和使用 ...

  8. SpringMVC (注解、拦截器、json、Ajax)

    SpringMVC 1.回顾MVC 1.1 什么是mvc MVC是模型(Model).视图(View).控制器(Controller)的简写,是一种软件设计规范. 是将业务逻辑.数据.显示分离的方法来 ...

  9. 【SpringMVC】自定义拦截器和过滤器

    一.闲话 五一假期明天结束了,咬咬牙把SpringMVC结束掉 二.基本要点 1.过滤器 除了之前我们提到的spring提供的过滤器之外,我们还可以自定义过滤器,使用步骤如下 编写java类实现Fil ...

最新文章

  1. vue接入萤石云_智能家居不香吗?萤石转型:或者臣妾做不到,或者费力不讨好...
  2. Spring-Boot项目部署到单独tomcat运行
  3. Shell命令-Sort,Join
  4. LeetCode Reverse Words in a String III
  5. 教你如何在 elasticsearch 中重建索引
  6. MapStruct 常用操作
  7. Oracle数据库exp和imp方式导数据
  8. 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_08-vuejs研究-vuejs基础-v-if和v-for指令...
  9. oracle EBS在中国的客户
  10. boost电路输出电流公式_​boost电路工作原理、参数计算、占空比
  11. java orb 是什么_什么是ORB
  12. 10的负8次方用python_matplotlib;10的分数次幂;科学记数法
  13. textarea中的换行如何展示在页面
  14. nodejs+Vue+Elementui的校园二手旧书交易交换平台sequelize
  15. mysql授权连接_MySQL 连接认证授权步骤
  16. 小韩详解 Iptables -- 简单使用
  17. ASCII编码,unicode编码,utf-8编码,三者的关系与区别(山河变幻到大一统)
  18. 如何隐藏CAD图纸中的部分图形对象?CAD局部隐藏
  19. kafka 消息队列
  20. UE4给角色赋予动画

热门文章

  1. 5道题,教你参破滑动窗口的解法
  2. 组态王7.5SP4版软件与加密狗匹配开发版+运行版使用分享
  3. 真是恍然大悟啊!宅家36天咸鱼翻身入职腾讯,知乎上已获万赞
  4. vue 实现可控圆形 + 样式的绑定
  5. 阿里巴巴校园招聘 —— 灵犀游戏开发测试岗笔试题目总结(菜鸡版解析)涉及知识点——十字链表、线程与堆栈、FTP、Telnet、红黑树、哈夫曼树、平衡二叉树、乐观锁、悲观锁、HTTP、NIM游戏
  6. 有放回随机抽样:重要参数subsample
  7. c语言的符号常量是什么,c语言字符常量是什么
  8. gdb 如何调试内存地址
  9. DFT - 对芯片测试的理解(一) 初识
  10. 对冲制裁风险:央行储备中的加密货币(1-4节)