springboot下的Filter过滤器;springmvc的HandlerInterceptorAdapter拦截器;Spring的GenericFilterBean过滤器
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;}
}
Springmvc
的HandlerInterceptorAdapter
拦截器
在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;}
}
Spring
的GenericFilterBean
过滤器
org.springframework.web.filter.GenericFilterBean
是spring
对Servelet
的Filter
的实现,我们继承GenericFilterBean
后可以将Servelet
的Filter
纳入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过滤器相关推荐
- Springmvc中的拦截器interceptor及与过滤器filter的区别
一.Springmvc中的拦截器概述及与过滤器filter的区别 1).Springmvc中的拦截器interceptor用于对控制器controller进行预处理和后处理的技术; 2).可以定义拦截 ...
- springBoot的过滤器,监听器,拦截器
概述 在开发中,我们经常要考虑一些问题,对敏感词进行过滤,用户是否已经登录,是否需要对他的请求进行拦截,或者领导问现在在线人数有多少人?我们如何实现这些功能哪 @WebFilterpackage co ...
- SpringMVC中的拦截器、过滤器的区别、处理异常
SpringMVC中的拦截器.过滤器的区别.处理异常 参考文章: (1)SpringMVC中的拦截器.过滤器的区别.处理异常 (2)https://www.cnblogs.com/ahaijava/p ...
- 【SpringMVC笔记】拦截器 + 文件上传下载
拦截器 + 文件上传下载 拦截器(interceptor) 自定义拦截器 验证用户是否登录 (认证用户) 没有拦截器 配置拦截器 文件的上传 文件输出流进行文件上传 file.Transto 进行文件 ...
- SpringMVC中的拦截器
SpringMVC中的拦截器 拦截器的作用 Spring MVC 的处理器拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理. 用户可以自己定义一些拦截器来实现 ...
- (转)SpringMVC学习(十二)——SpringMVC中的拦截器
http://blog.csdn.net/yerenyuan_pku/article/details/72567761 SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter, ...
- 【SpringMVC学习11】SpringMVC中的拦截器
Springmvc的处理器拦截器类似于Servlet 开发中的过滤器Filter,用于对处理器进行预处理和后处理.本文主要总结一下springmvc中拦截器是如何定义的,以及测试拦截器的执行情况和使用 ...
- SpringMVC (注解、拦截器、json、Ajax)
SpringMVC 1.回顾MVC 1.1 什么是mvc MVC是模型(Model).视图(View).控制器(Controller)的简写,是一种软件设计规范. 是将业务逻辑.数据.显示分离的方法来 ...
- 【SpringMVC】自定义拦截器和过滤器
一.闲话 五一假期明天结束了,咬咬牙把SpringMVC结束掉 二.基本要点 1.过滤器 除了之前我们提到的spring提供的过滤器之外,我们还可以自定义过滤器,使用步骤如下 编写java类实现Fil ...
最新文章
- vue接入萤石云_智能家居不香吗?萤石转型:或者臣妾做不到,或者费力不讨好...
- Spring-Boot项目部署到单独tomcat运行
- Shell命令-Sort,Join
- LeetCode Reverse Words in a String III
- 教你如何在 elasticsearch 中重建索引
- MapStruct 常用操作
- Oracle数据库exp和imp方式导数据
- 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_08-vuejs研究-vuejs基础-v-if和v-for指令...
- oracle EBS在中国的客户
- boost电路输出电流公式_​boost电路工作原理、参数计算、占空比
- java orb 是什么_什么是ORB
- 10的负8次方用python_matplotlib;10的分数次幂;科学记数法
- textarea中的换行如何展示在页面
- nodejs+Vue+Elementui的校园二手旧书交易交换平台sequelize
- mysql授权连接_MySQL 连接认证授权步骤
- 小韩详解 Iptables -- 简单使用
- ASCII编码,unicode编码,utf-8编码,三者的关系与区别(山河变幻到大一统)
- 如何隐藏CAD图纸中的部分图形对象?CAD局部隐藏
- kafka 消息队列
- UE4给角色赋予动画
热门文章
- 5道题,教你参破滑动窗口的解法
- 组态王7.5SP4版软件与加密狗匹配开发版+运行版使用分享
- 真是恍然大悟啊!宅家36天咸鱼翻身入职腾讯,知乎上已获万赞
- vue 实现可控圆形 + 样式的绑定
- 阿里巴巴校园招聘 —— 灵犀游戏开发测试岗笔试题目总结(菜鸡版解析)涉及知识点——十字链表、线程与堆栈、FTP、Telnet、红黑树、哈夫曼树、平衡二叉树、乐观锁、悲观锁、HTTP、NIM游戏
- 有放回随机抽样:重要参数subsample
- c语言的符号常量是什么,c语言字符常量是什么
- gdb 如何调试内存地址
- DFT - 对芯片测试的理解(一) 初识
- 对冲制裁风险:央行储备中的加密货币(1-4节)