Filter&Json
一、Filter
Filter 表示过滤器,是 JavaWeb 三大组件(Servlet、Filter、Listener)之一
过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能。
Filter的作用:
而在访问到这些资源之前可以使过滤器拦截来下,也就是说在访问资源之前会先经过 Filter,如下图
过滤器还可以做 统一编码处理
、 敏感字符处理
、权限控制
…
1.1 开发步骤
-
定义类,实现 Filter接口,并重写其所有方法
-
配置Filter拦截资源的路径:在类上定义
@WebFilter
注解。而注解的value
属性值/*
表示拦截所有的资源
-
在doFilter方法中输出一句话,并放行
注意:
上述代码中的 chain.doFilter(request,response);
就是放行,也就是让其访问本该访问的资源。
1.2 Filter的执行流程
如上图是使用过滤器的流程,我们通过以下问题来研究过滤器的执行流程:
-
放行后访问对应资源,资源访问完成后,还会回到Filter中吗?
从上图就可以看出肯定 会 回到Filter中
-
如果回到Filter中,是重头执行还是执行放行后的逻辑呢?
如果是重头执行的话,就意味着
放行前逻辑
会被执行两次,肯定不会这样设计了;所以访问完资源后,会回到放行后逻辑
,执行该部分代码。
通过上述的说明,我们就可以总结Filter的执行流程如下:
1.3 过滤器链
过滤器链是指在一个Web应用,可以配置多个过滤器,这多个过滤器称为过滤器链。
上图中的过滤器链执行是按照以下流程执行:
- 执行
Filter1
的放行前逻辑代码 - 执行
Filter1
的放行代码 - 执行
Filter2
的放行前逻辑代码 - 执行
Filter2
的放行代码 - 访问到资源
- 执行
Filter2
的放行后逻辑代码 - 执行
Filter1
的放行后逻辑代码
以上流程串起来就像一条链子,故称之为过滤器链。
注意:
我们现在使用的是注解配置Filter,而这种配置方式的优先级是按照过滤器类名(字符串)的自然排序。
比如有如下两个名称的过滤器 : BFilterDemo
和 AFilterDemo
。那一定是 AFilterDemo
过滤器先执行。
二、JSON
JSON
是一种轻量级的数据交换格式,用来实现前后端的数据交互。 定义格式如下:
属性为数字…可不用双引号
var 变量名 = '{"key":value,"key":value,...}';
json的嵌套格式:
- 数组嵌套对象
[
{
"name": "ly",
"num": 120,
"age": "18"
},
{
"name": "ly",
"num": 120,
"age": "18"
}
]
- 对象嵌套数组
{
"id": 1001,
"name": "Lyman",
"goods": [
"food1",
"food2",
"food3"
]
}
JSON
串的键要求必须使用双引号括起来,而值根据要表示的类型确定。value 的数据类型分为如下:
- 数字(整数或浮点数)
- 字符串(使用双引号括起来)
- 逻辑值(true或者false)
- 数组(在方括号中)
- 对象(在花括号中)
- null
示例:
var jsonStr = '{"name":"zhangsan","age":23,"addr":["北京","上海","西安"]}'
2.1 JSON串和Java对象的相互转换
前后端的开发中,我们之间的数据就是通过json格式的数据传递的
重点操作:
- 请求数据:JSON字符串转为Java对象
- 响应数据:Java对象转为JSON字符串
2.1.1 Fastjson (JSON 库)
Fastjson
是阿里巴巴提供的一个Java语言编写的高性能功能完善的 JSON
库,是目前Java语言中最快的 JSON
库,可以实现 Java
对象和 JSON
字符串的相互转换。
2.1.2 Fastjson 的使用
一:导入坐标依赖:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>
二:Java对象转JSON
String jsonStr = JSON.toJSONString(obj);
三:JSON字符串转Java对象
User user = JSON.parseObject(jsonStr, User.class);
从前端获取JSON字符串之后,通过request获取的字符缓冲流读取
BufferReader reader =request.getReader();
String jsonStr =reader.readLine();
之后就可以利用使用JSON的parseObject方法,将json字符串转化为封装的对象,之后利用对象来读取前段传来的数据