Servlet补充(序列化,拷贝,代理服务器)
目录
一.序列化和反系列化
1.认识序列化
网络数据传输,双方需要约定好同一的数据格式(广泛使用的统一标准就是协议,小众就是序列化和反序列化)
Java序列化是指把Java对象转换为字节序列的过程,而Java反序列化是指把字节序列恢复为Java对象的过程
注意:只有实现了Serializable或Externalizable接口的类的对象才能被序列化,否则抛出异常!
2.代码示例
//定义一个ObjectMapper类,主要实现java类和json对象之间的转换
private static final ObjectMapper MAPPER = new ObjectMapper();
<1>序列化
/**
* JSON序列化,将java对象序列化为json字符串
*
* @param o java对象
* @return json字符串
*/
//序列化,返回json字符串
public static String serialize(Object o) {
try {
return MAPPER.writeValueAsString(o);
} catch (JsonProcessingException e) {
e.printStackTrace();
throw new RuntimeException("json序列化失败" + o);
}
}
<2>反序列化
/**
* 反序列化操作
*
* @param is 输入流
* @param clazz 指定要反序列化的类型
* @param <T>
* @return 反序列化对象
*/
//反序列化(使用输入流InputStream获取输入字符串)
public static <T> T deserialize(InputStream is, Class<T> clazz) {
try {
return MAPPER.readValue(is, clazz);
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("json反序列化失败" + clazz.getName());
}
}
<3>测试
public class JSONUtilTest {
//单元测试,junit框架使用方法上@Test注解,保证方法为public void
@Test
public void testSerialize() {
//测试序列化操作,使用map模拟复杂
Map map = new HashMap();
map.put("name", "1班");
map.put("students", new int[]{1, 2});
String json = JSONUtil.serialize(map);
Assert.assertNotNull(json);
}
@Test
public void testDeSerialize() {
//测试反序列化
//类加载器加载某个资源,返回输入流
InputStream is = JSONUtilTest.class.
getClassLoader().getResourceAsStream("login.json");//特别注意该api
Map map = JSONUtil.deserialize(is, Map.class);
System.out.println(map);
Assert.assertNotNull(map);
}
}
二.深拷贝浅拷贝
结论:
深拷贝就是两个不同的引用指向不同的对象,但是对象内容完全相同,浅拷贝就是两个不同的引用指向同一个对象
三.正向代理服务器和反向代理服务器
1.正向代理服务器
<1>概念
正向代理服务器:抓包工具
正向代理是一个位于客户端和目标服务器之间的代理服务器(中间服务器)。为了从原始服务器取得内容,客户端向代理服务器发送一个请求,并且指定目标服务器,之后代理向目标服务器转交并且将获得的内容返回给客户端。正向代理的情况下客户端必须要进行一些特别的设置才能使用。
<2>原理图
<3>使用场景和特点
1.特点:要访问的服务器只知道代理服务器来访问它,并不知道真实的客户端是谁
2.使用场景:正向代理的典型用途是为在防火墙内的局域网客户端提供访问Internet的途径。正向代理还可以使用缓冲特性减少网络使用率。
2.反向代理服务器
<1>概念
反向代理服务器:nginx等
反向代理正好相反。对于客户端来说,反向代理就好像目标服务器。并且客户端不需要进行任何设置。客户端向反向代理发送请求,接着反向代理判断请求走向何处,并将请求转交给客户端,使得这些内容就好似他自己一样,一次客户端并不会感知到反向代理后面的服务,也因此不需要客户端做任何设置,只需要把反向代理服务器当成真正的服务器就好了
<2>原理图
<3>使用场景和特点
1.特点:特点:反向代理服务器隐藏了真实服务器的信息,例如淘宝,京东,天猫等
2.使用场景:
反向代理的典型用途是将 防火墙后面的服务器提供给Internet用户访问。反向代理还可以为后端的多台服务器提供负载平衡,或为后端较慢的服务器提供缓冲服务。