Spring-编码过滤----解析Filter实现原理,Java中高级面试题最新
时间:2021-09-20
本文章向大家介绍Spring-编码过滤----解析Filter实现原理,Java中高级面试题最新,主要包括Spring-编码过滤----解析Filter实现原理,Java中高级面试题最新使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
### 二、过滤器(Filter)的概念
1. 过滤器位于客户端和web应用程序之间,用于检查和修改两者之间流过的请求和响应。
2. 在请求到达Servlet/JSP之前,过滤器截获请求。
3. 在响应送给客户端之前,过滤器截获响应。
4. 多个过滤器形成一个过滤器链,过滤器链中不同过滤器的先后顺序由部署文件web.xml中过滤器映射的顺序决定。
5. 最先截获客户端请求的过滤器将最后截获Servlet/JSP的响应信息。
### 三、实现过滤器
可以通过实现javax.servlet.Filter类来实现自定义过滤器。
public class MyFilter implements Filter {
public void init(FilterConfig fc) { //过滤器初始化代码 }
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
try { //在这里可以对客户端请求进行检查 //沿过滤器链将请求传递到下一个过滤器。 chain.doFilter(request, response); //在这里可以对响应进行处理 } catch (IOException e) {
e.printStackTrace();
} catch (ServletException e) {
e.printStackTrace();
}
}
public void destroy( ) { //过滤器被销毁时执行的代码 }
}
### 四、过滤器的链式结构
可以为一个Web应用组件部署多个过滤器,这些过滤器组成一个过滤器链,每个过滤器只执行某个特定的操作或者检查。这样请求在到达被访问的目标之前,需要经过这个过滤器链。
![image.png](https://upload-images.jianshu.io/upload_images/24613101-49be8bf58eae19b4.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
### 五、如何实现链式结构
其实Filter的链式结构是使用了Java中的责任链模式。下面我用简单的例子来实现责任链模式,然后再来讲解Spring容器中的实现。下面是我整个的包结构:
![image.png](https://upload-images.jianshu.io/upload_images/24613101-fd74aec051273305.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
然后我再来详细说明每个类的说明: 1、Filter.java。用来模拟Servlet中的Filter.java.
public interface Filter {
void doFilter(Request request, Response response, FilterChain filterChain);
}
2、Request.java。用来模拟Servlet中HttpServletRequest.java。
@Data
public class Request {
private String requestStr;
}
3、Response.java。用来模拟Servlet中的HttpServletResponse.java。
@Data
public class Response {
private String responseStr = "responseStr";
}
4、HtmlFilter.java。用来把”:)”转换成”^-^”,并且标记执行顺序
public class HtmlFilter implements Filter {
@Override
public void doFilter(Request request, Response response, FilterChain filterChain) {
String newRequestStr = request.getRequestStr().replace(":)", "^-^") + "----HtmlFilter";
request.setRequestStr(newRequestStr);
filterChain.doFilter(request, response, filterChain);
String newResponseStr = response.getResponseStr() + "----HtmlFilter";
response.setResponseStr(newResponseStr);
}
}
5、TextFilter.java。用来做字符串转换
public class TextFilter implements Filter {
@Override
public void doFilter(Request request, Response response, FilterChain filterChain) {
String newRequestStr = request.getRequestStr().replace("中国10.1", "中国") + "----TextFilter";
request.setRequestStr(newRequestStr);
filterChain.doFilter(request, response, filterChain);
String newResponseStr = response.getResponseStr() + "----TextFilter";
response.setResponseStr(newResponseStr);
}
}
6、FilterChain.java。用来模拟Servlet中的FilterChain,只不过这个类是一个接口。这个类同时也是实现了Filter这个接口,这样设计更加精巧。等下我们对比一下Spring中的对ServletChain的实现就可以发现了。
public class FilterChain implements Filter {
private List<Filter> filters = Lists.newArrayList();
private int currentPosition = 0;
public FilterChain addFilter(Filter filter){
this.filters.add(filter);
return this;
}
@Override
public void doFilter(Request request, Response response, FilterChain filterChain) {
if (this.currentPosition == this.filters.size()) {
return;
}
this.currentPosition++;
Filter nextFilter = this.filters.get(this.currentPosition - 1);
nextFilter.doFilter(request, response, this);
}
}
7、Client.java。用来测试结果。
public class Client {
public static void main(String[] args) {
String requestStr = "1111111,2222222:),中国10.1国庆节....";
Request request = new Request();
request.setRequestStr(requestStr);
Response response = new Response();
FilterChain filterChain = new FilterChain();
filterChain.addFilter(new HtmlFilter()).addFilter(new TextFilter());
filterChain.doFilter(request, response, filterChain);
System.out.println(request.getRequestStr());
System.out.println(response.getResponseStr());
}
}
我们先来看看运行结果,再来分析实现原理。运行结果如下:
# 总结
蚂蚁面试比较重视基础,所以Java那些基本功一定要扎实。蚂蚁的工作环境还是挺赞的,因为我面的是稳定性保障部门,还有许多单独的小组,什么三年1班,很有青春的感觉。面试官基本水平都比较高,基本都P7以上,除了基础还问了不少架构设计方面的问题,收获还是挺大的。
**[CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】](https://ali1024.coding.net/public/P7/Java/git)**
* * *
**经历这次面试我还通过一些渠道发现了需要大厂真实面试主要有**:蚂蚁金服、拼多多、阿里云、百度、唯品会、携程、丰巢科技、乐信、软通动力、OPPO、银盛支付、中国平安等初,中级,高级Java面试题集合,附带超详细答案,希望能帮助到大家。
![蚂蚁金服5面,总结了49个面试题,遇到的面试官都是P7级别以上](https://upload-images.jianshu.io/upload_images/24616006-2b976d3b5a750638?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
原文地址:https://www.cnblogs.com/hgysvadavvc/p/15313914.html
- 一文读懂如何用 Python 实现6种排序算法
- 三星KNOX远程静默安装漏洞深入分析报告
- 技术分享:MSSQL注入xp_cmdshell
- 通过5个简单序列预测实例学习LSTM递归神经网络
- Google发现Windows 8.1 0day漏洞并公布漏洞验证程序(PoC)
- 携程React Native实践
- 数据分析告诉你:Php最不安全,Nginx比Apache安全
- 用python抓取摩拜单车API数据并做可视化分析(源码)
- 用Pandas在Python中可视化机器学习数据
- Intent 属性详解(下)
- 把复杂json解析成javabean思路:思路:
- Python数据科学计算库的安装和numpy简单
- 4G安全:研究人员发现攻击4G无线上网卡和SIM卡的方法
- Python文学化编程 - Jupyter notebook使用和插件拓展
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 逐行阅读Spring5.X源码(九)spring利用CGLIB实现动态代理原理剖析
- 逐行阅读Spring5.X源码(十)spring如何解决循环引用,bean实例化过程源码详解
- 逐行阅读Spring5.X源码(十一)AOP概念、应用、原理
- java当中的线程和操作系统的线程是什么关系?
- 基于OpenCV 的车牌识别
- Redis入坟(六)分布式集群,概念、原理、实操
- Redis入坟(一)redis的前世今生、redis基础及存储结构源码讲解
- Redis入坟(二)高级特性,发布订阅、事务、Lua脚本
- 使用OpenCV对运动员的姿势进行检测
- Redis入坟(三)Redis为什么这么快?
- Redis入坟(番外篇)配置文件redis.conf,解析每个参数的含义
- 使用OpenCV自动去除背景色
- Redis入坟(四)Redis内存回收知多少
- Redis入坟(五)持久化
- Python爬取杜赛博客教程内容,应用pdfkit打印pdf文件