博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
前端工程师基础课程作业
阅读量:5994 次
发布时间:2019-06-20

本文共 5316 字,大约阅读时间需要 17 分钟。

一、问答题:
(1)139邮箱资源服务器与缓存相关的响应首部是怎么配置的?
(2)登录139邮箱web2.3,在浏览器有缓存的情况下,刷新页面,浏览器会不会重新发送请求获取静态资源?如果会,请列出与缓存相关的请求首部以及响应状态码;如果不会,请说明原因。
(3)请指出Cache-Control与Expires的区别
(4)新功能上线后,如何清空浏览器的缓存,让用户获取最新的资源文件?
问题1、问题2 可用Fiddler抓包然后截图说明。
二、编程题:
请写一个页面,并封装相应的JS代码,完成139邮箱的写信功能,无需调用邮箱组件,完成发信功能即可。
 
 
我的答案:
一 问答题:
(1)、
139邮箱资源服务器与缓存相关的响应首部配置如下图所示:
  
(2)、
依然会重新发送请求获取静态资源,服务器响应304 Not Modified,所以会使用本地资源。
           从请求头部可知缓存max-age = 0,没有缓存请求,所以会再发送请求。
      
(3)、
    网页的缓存是由HTTP消息头中的“Cashe-control”来控制的,其中max-age的值表示在此值内的时间里不会重新访问服务器。
    Expires 表示存在时间,允许客户端在这个时间之前不去检查(发请求),等同max-age的效果。但是如果同时存在,则被Cache-Control的max-age覆盖。
    
Cache-control: 
  根据是否可缓存分为
  Public 指示响应可被任何缓存区缓存。
  Private 指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的
  部分响应消息,此响应消息对于其他用户的请求无效。
  no-cache 指示请求或响应消息不能缓存(HTTP/1.0用Pragma的no-cache替换)
  根据什么能被缓存
  no-store 用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。
  根据缓存超时
  max-age 指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。
  min-fresh 指示客户机可以接收响应时间小于当前时间加上指定时间的响应。
  max-stale 指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。

    Expires: 

数据包中的格式:
Expires = "Expires" ":" HTTP-date
 
例如
Expires: Thu, 01 Dec 1994 16:00:00 GMT
 (必须是GMT格式)
(4)、
   
可以在地址后面加版本号。
    因为HTTP请求时候,如果访问的路径不变,而客户端缓存中又有该文件时,浏览器会直接调用缓存中的文件。这样的话,即使服务器的资源文件更新了,但是客户端仍然有可能显示的是以前的资源文件。而加上新的版本号以后,浏览器会认为这是一个新的地址,会重新下载最新版本的文件。加版本号会强制浏览器更新,清空浏览器的缓存,让用户获取最新的资源文件。
 
二、编程题:
    我的思路是
    1、用139邮箱的写信功能发送一封信件,通过Fiddler抓包获取邮件发送接口。
    2、通过抓包,在TextView中观察发送出去的数据。
    3、编写写信页面(包含收件人、主题、正文),命名为index.html,将其挂载在Fiddler上。
    4、获取登陆后URL中sid的值。
    5、用ajax将写信页面中的收件人、主题、正文的值传到服务器。
 
HTML代码:
139邮箱
139邮箱写信页面
收件人:
主题:
正文:
JS代码:
function send() {                function QueryString(){    //这个函数是获取sid值                var name;                var value;                var str=location.href;                var num=str.indexOf("?")                var str=str.substr(num+1);                var arrtmp=str.split("&");                for(var i=0 ; i < arrtmp.length ; i++){                    num=arrtmp[i].indexOf("=");                    if(num>0){                        name=arrtmp[i].substring(0,num);                        value=arrtmp[i].substr(num+1);                        this[name]=value;                    }                }            }            function cookieString(){    //这个函数是获取cookie中的电话值                var name;                var value;                var str=document.cookie;                var arrtmp=str.split("; ");                for(var i=0 ; i < arrtmp.length ; i++){                    num=arrtmp[i].indexOf("=");                    if(num>0){                        name=arrtmp[i].substring(0,num);                        value=arrtmp[i].substr(num+1);                        this[name]=value;                    }                }            }            var Request1=new cookieString();            cookieNum = Request1["Login_UserNumber"];            email = cookieNum+"@139.com";                    //调用函数QueryString()获取URL中的sid            var Request=new QueryString();            ID=Request["sid"];            var to;                    //收件人            var subject;            //主题            var content;            //正文            to = document.getElementsByName("to")[0].value;                        //获取收件人地址            subject = document.getElementsByName("subject")[0].value;        //获取主题内容            content = document.getElementsByName("content")[0].value;        //获取正文内容                        //将从页面获得的数据插入到抓包得到的数据            var str = ' 
""<'+email+'>
'+to+'
0
1
'+subject+'
'+content+'
3
0
0
1
0
1
0
0
deliver
0
1
'; //先声明一个异步请求对象 var xmlHttpReg = null; if (window.ActiveXObject) {
//如果是IE xmlHttpReg = new ActiveXObject("Microsoft.XMLHTTP"); } else if (window.XMLHttpRequest) { xmlHttpReg = new XMLHttpRequest(); //实例化一个xmlHttpReg } //如果实例化成功,就调用open()方法,就开始准备向服务器发送请求 if (xmlHttpReg != null) { xmlHttpReg.open("post", "http://appmail.mail.10086.cn/RmWeb/mail?func=mbox:compose&categroyId=103000000&sid="+ID , true); xmlHttpReg.send(str); xmlHttpReg.onreadystatechange = doResult; //设置回调函数 } //回调函数,一旦readyState的值改变,将会调用这个函数,readyState=4表示完成相应设定函数doResult() function doResult() { if (xmlHttpReg.readyState == 4) {
//4代表执行完成 if (xmlHttpReg.status == 200) {
//200代表执行成功 //将xmlHttpReg.responseText的值赋给ID为resText的元素 document.getElementById("resText").innerHTML = xmlHttpReg.responseText; } } } }

 

 

 

转载于:https://www.cnblogs.com/qianlihorse/p/3868121.html

你可能感兴趣的文章
怎样将ppt转换成pdf
查看>>
firefox 解决apache http server 开发过程中的缓存问题
查看>>
JavaScript中创建对象的4种方式
查看>>
Vue------第五天(关于组件的一些基础了解,包括组件的注册、Prop、自定义事件、使用插槽分发内容等)...
查看>>
linux 给目录增加sgid权限
查看>>
POJ 1308 Is It A Tree?
查看>>
Scrapy常见问题(FAQ)
查看>>
java里int和Integer什么区别
查看>>
搜索常用到的“Do you mean"功能的算法(收藏)
查看>>
PHP安全方面的配置
查看>>
(转)如何选择 compileSdkVersion, minSdkVersion,targetSdk
查看>>
【win10系统】idea 修改Git密码和账号方法
查看>>
RandomAccessFile
查看>>
Mysql 不同条件进行修改存储
查看>>
百度地图给map添加右键菜单(判断是否为marker)
查看>>
线程的状态
查看>>
CentOS 6.4上通过yum安装Nagios-3.5.0 [服务端/server端]
查看>>
ODL Beryllium (Be) - The Fourth Release of OpenDaylight PRODUCTION-READY OPEN SDN PLATFORM
查看>>
Cortex-M0 ARM-GCC 编译链接选项
查看>>
JFinal中EhCache利用RMI方式分布式缓存配置
查看>>