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. SAD和SATD的区别[摘]
  2. jQuery给input CheckBox的值查询的一致就选中
  3. Linux学习 Unit 4
  4. python实现DES算法
  5. Spring(3)bean 注入-构造方法注入 那么又为什么需要依赖注入呢?
  6. SSH-keygen参数说明
  7. linux c实现mypwd
  8. swift UIActivityIndicatorView
  9. JS中(JS转换json/jQuery转换json)中的long型大数精度丢失问题
  10. Discuz X1.5 X2.5 X3 UC_KEY Getshell Write PHPCODE into config/config_ucenter.php Via /api/uc.php Vul
  11. ADO获取表的所有字段名
  12. php中对数组进行转码,php实现转码的方式(支持数组类型转码)
  13. 易软门诊管理软件php,易软门诊管理系统
  14. 传值中处理jsp中文乱码问题
  15. 推荐一本go语言入门书籍
  16. 深度学习 --- Hopfield神经网络详解(吸引子的性质、网络的权值的设计、网络的信息存储容量)
  17. 【题解】Luogu P3110 [USACO14DEC]驮运Piggy Back
  18. 中国牛市短线炒股有哪些特征中国牛市炒股如何操作呢
  19. 前端jQuery读取本地文件内容
  20. scdl matlab,5自由度移动机器人的建模与仿真-硕士论文

热门文章

  1. PowerDesigner 逆向工程,太实用了!
  2. 又一巨头撤离中国,辉煌时拿下20%中国市场,没落后甩开中国制造
  3. jsp mysql 博客系统_个人博客系统的设计与实现(JSP,MySQL)
  4. 2019-2021书单
  5. android电话应用图标不见了,[问答] 华为手机应用图标消失
  6. 虚幻浏览器插件 中文输入
  7. HTML 基本标签大全
  8. RStudio安装包时报错:Package LibPath Version Priority Depends Imports LinkingTo Suggests Enhances OS_
  9. 计算机视觉项目:手势拖拽方块和手势控制音量
  10. 《PyQt5高级编程实战》自定义信号详解