1、Log Filter Analysis
HttpServletRequest hrequest = (HttpServletRequest) request;
HttpServletRequest和ServletRequest都是接口,并且后者是前者的父接口。但是前者相对于后者多了一些针对于HTTP协议的方法,如getHead(String name)等等,所以在LogFilter中进行了转换。
System.out.println("Filter 已经截获到用户的请求的地址:" + hrequest.getServletPath());
这个程序语句作用是通过getServletPath()方法获取到了请求的路径,就是在日志中记录了请求的url。
long after = system.currentTimeMillis();
这个语句的作用是获取系统的当前时间。
详细的对其理解为:
首先,这段代码是一段日志Filter,这个Filter负责拦截所有的用户请求,并将请求的信息记录在日志中,核心代码如下:
//声明了一个不带返回值的doFilter方法并带三个形参,FilterChain是过滤链的意思
public void doFilter(ServletRequest request ServletResponse response FilterChain chain)
//如果调用该方法时出错,则抛出异常,类型为IO或Servlet
throws IOExceptions ServletExceptions
{
//通过调用getServeletContext方法获取ServletContext对象,用于记录日志
ServletSontext contex t= this.config.getServeletContext();
//调用currentTimeMillis函数来获得当前的时刻
long before = System.currentTimeMillis();
System.out.println("过滤开始...................");
//将请求强制转化为HttpServletRequest请求,HttpServletRequest接口遵循http协议
HttpServletRequest hrequest = (HttpServletRequest)Request;
//通过对象hrequest调用getServletPath方法获得用户请求地址
System.out.println("Filter已经截获到用户请求的地址:" + hrequest.getServletPath());
//链式处理请求和响应
chain.doFilter(request,response);
//调用currentTimeMillis函数来获得处理后的时刻
long after = System.currentTimeMillis();
System.out.println("过滤结束");
//调用getRequestURL方法获得请求的URL
System.out.println("请求被定位到" + hrequest.getRequestURL() + "所花的时间为:" + (after - long));
}
2、session的理解
在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。
Session作为贯穿Hibernate的持久化管理器核心,提供了众多的持久化的方法,如save(),update,delete,find(Hibernate 3中已经取消了此方法,)等,通过这些方法我们可以透明的完成对象的增删改查,这里所谓的透明是指,Session在读取,创建和删除映射的实体对象的实例时,这一系列的操作将被转换为对数据库表中数据的增加,修改,查询和删除操作。
服务器创建session出来后,会把session的ID号,以cookie的形式回写给客户机,这样,只要客户机的浏览器不关,再去访问服务器时,都会带着session的ID号去,服务器发现客户机浏览器带session id过来了,就会使用内存中与之对应的session为之服务。
cookie是Web服务器发送给浏览器的一块信息。浏览器会在本地文件中给每一个Web服务器存储cookie。以后浏览器在给特定的Web服务器发请求的时候,同时会发送所有为该服务器存储的cookie。
session是指用来在客户端与服务器端之间保持状态的解决方案以及存储架构。
无论客户端浏览器做怎么样的设置,session都应该能正常工作。客户端可以选择禁用cookie,但是session仍然是能够工作的,因为客户端无法禁用服务端的session。
在存储的数据量方面session和cookies也是不一样的。session能够存储任意的Java对象,cookie只能存储String类型的对象。
cookie是客户端的,session是服务端的。cookie存储于客户端,记录web服务器的信息,每次上网时都会先查看对应的cookie信息,比如购物时,使用cookie记录购物车信息。session是记录客户机的信息,SessionID是session的唯一标识,使用session可以记录客户端的请求等。
无论客户端浏览器做怎么样的设置,session都应该能正常工作。客户端可以选择禁用cookie,但是,session仍然是能够工作的,因为客户端无法禁用服务端的session。
在存储的数据量方面session和cookies也是不一样的。session能够存储任意的JAVA对象,cookie只能存储String类型的对象。
前文有一个 Generator 函数,依次读取两个文件。
var fs = require(‘fs‘); var readFile = function (fileName){ return new Promise(function (resolve, reject){ fs.readFile(fileName, function(error, data){ if (error) reject(error); resolve(data); }); }); }; var gen = function* (){ var f1 = yield readFile(‘/etc/fstab‘); var f2 = yield readFile(‘/etc/shells‘); console.log(f1.toString()); console.log(f2.toString()); };
写成 async 函数,就是下面这样。
var asyncReadFile = async function (){ var f1 = await readFile(‘/etc/fstab‘); var f2 = await readFile(‘/etc/shells‘); console.log(f1.toString()); console.log(f2.toString()); };
一比较就会发现,async 函数就是将 Generator 函数的星号(*)替换成 async,将 yield 替换成 await,仅此而已。
async优点
async 函数对 Generator 函数的改进,体现在以下三点。
(1)内置执行器。 Generator 函数的执行必须靠执行器,所以才有了 co 函数库,而 async 函数自带执行器。也就是说,async 函数的执行,与普通函数一模一样,只要一行。
var result = asyncReadFile();
(2)更好的语义。 async 和 await,比起星号和 yield,语义更清楚了。async 表示函数里有异步操作,await 表示紧跟在后面的表达式需要等待结果。
(3)更广的适用性。 co 函数库约定,yield 命令后面只能是 Thunk 函数或 Promise 对象,而 async 函数的 await 命令后面,可以跟 Promise 对象和原始类型的值(数值、字符串和布尔值,但这时等同于同步操作)。