浏览器向服务器每次发送请求都比较耗费资源和时间,当访问量特别大的时候会对服务器造成很高的压力,这个时候页面静态化就可以起到减少服务器的压力。
页面静态化 -- 把一些变化很少的动态页面,通过技术转化为静态页面。
静态页面的可以被缓存在浏览器中,第一次请求需要发给服务器,后面的再次请求(在缓存时间内),只需要在本地浏览器缓存中读取静态页面并展示。
浏览器缓存:
当第一次请求,服务器如果返回一个静态页面,浏览器会把它放入缓存中。后续访问这个页面,浏览器不会再次发送请求给服务器,而是直接从缓存中获取该页面。使用F5刷新页面会使得浏览器跳过缓存,再次向服务器请求。由于浏览器缓存距离使用者最近,所以响应最快,缓存带来的性能提升最高。
静态页面缓存,会有一个 max-age 即最大存活期,超过这个期限的缓存信息不在起作用,请求就会发送给服务器。
304状态码
超过 max-age 的请求会发送给服务器,但是服务器会根据最新修改时间来判断,如果服务器发现页面在这一段时间内并没有发生变化,会给请求者返回304状态吗。
告诉浏览器,这个页面并没有发生变化,此时浏览器会继续从缓存中读取该静态信息展示。虽然仍会向服务器发送请求,但可以减少网络传输数据对服务器造成的压力。
cdn缓存
如果请求发送的位置距离服务器过远的时候,会造成数据远距离传输,造成性能较低。我们可以将请求(获取静态资源)发送给请求地和服务器中间的一个距离最近的cdn服务器,由cdn服务器返回结果。第一次请求的时候cdn服务器会从主服务器中读取静态资源(图片、html)存入到缓存中。
页面静态化技术
将动态页面生成为静态页面,以便利用上述几种缓存,提高性能。
具体步骤如下:
1、利用spring提供的RestTemplate类访问动态页面
2、会返回一端html的结果,将该结果写入到一个html页面中
具体代码如下:
RestTemplate template = new RestTemplate();
//创建请求头对象
HttpHeaders headers = new HttpHeaders();
//向请求头中添加登陆过后的cookie,模拟登陆以后的账号发送请求
headers.add(HttpHeaders.COOKIE,"JSESSIONID=E292CE7BCB180539508421EB304D249A");
//创建接受结果的Entity对象
HttpEntity entity = new HttpEntity(null, headers); // 包含了请求头和请求体
//调用RestTemplate对象的exchange()方法请求该路径
ResponseEntity<String> response = template.exchange("http://localhost/xx", HttpMethod.GET, entity, String.class);
//获取响应的html字符串,写入一个文件
FileOutputStream out = new FileOutputStream("F:\\html\\xxx.html");
out.write(response.getBody().getBytes("utf-8"));
out.close();
exchange()方法需要三个参数,第一个参数是访问路径,第二个参数是请求格式,第三个参数接受响应结果的Entity对象,第四个参数是响应数据的类型。
3、将html写入到本地磁盘以后,只需要在项目中配置访问静态的文件的方式即可。
我这个例子中是SpringBoot项目所以我通过配置类来配置静态资源访问。
配置如下:
@Configuration
public class MyWebConfig implements WebMvcConfigurer {
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();//开启静态文件配置
}
public void addInterceptors(InterceptorRegistry registry) {
}
}
彩蛋
如果是SpringMVC项目,需要在xml文件中配置如下,也可以进行静态资源配置
<beans>
<!-- 视图解析器 -->
<mvc:view-resolvers>
//todo
</mvc:view-resolvers>
<!-- 静态资源配置 -->
<mvc:default-servlet-handler/>
<!-- 上传文件解析器 -->
<mvc:resources mapping="url路径" location="服务器磁盘路径"/> <!-- 把一个web路径映射到服务器上的一个静态资源 -->
</beans>