一 Session篇
1. Session是什么?
Session 对象存储特定用户会话所需的属性及配置信息;
Session一词与网络协议相关联时,它又往往隐含了“面向连接”和/或“保持状态”这样两个含义,“面向连接”指的是在通信双方在通信之前要先建立一个通信的渠道;
在web服务器蓬勃发展的时代,session在web开发语境下的语义又有了新的扩展,它的含义是指一类用来在客户端与服务器之间保持状态的解决方案。
2. Session的工作原理
1). 创建Session:当用户访问到一个服务器,如果服务器启用Session,服务器就要为该用户创建一个SESSION,在创建这个SESSION的时候,服务器首先检查这个用户发来的请求里是否包含了一个SESSION ID,这个SESSION ID是唯一的、不重复的、不容易找到规律的字符串,这个SESSION ID将被在本次响应中返回到客户端保存,而保存这个SESSION ID的正是COOKIE,这样在交互过程中浏览器可以自动的按照规则把这个标识发送给服务器;
2). 使用Session:经常被使用的一种技术叫做URL重写,就是把Session id直接附加在URL路径的后面一种是作为URL路径的附加信息;另一种是作为查询字符串附加在URL后面;还有一种就是表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把Session id传递回服务器;
3. 作用:
Session的根本作用就是在服务端存储用户和服务器会话的一些信息。典型的应用有:
1). 判断用户是否登录。
2). 购物车功能。
4. 用法:
可以使用 Session 对象存储特定用户会话所需的信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。
当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。
Session 对象最常见的一个用法就是存储用户的首选项。例如,如果用户指明不喜欢查看图形,就可以将该信息存储在 Session 对象中。
注意:会话状态仅在支持 cookie 的浏览器中保留。
5. Session与cookies的区别:
1). cookie数据存放在客户的浏览器上,session数据放在服务器上;
2). cookie不是很安全,别人可以分析存放在本地的COOKIE并进行cookie欺骗考虑到安全应当使用session;
3). session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能考虑到减轻服务器性能方面,应当使用cookie;
4). 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
Session是通过cookie来工作的。
二 代码篇
@WebFilter(filterName="log" ,urlPatterns={"/*"}) //创建一个LOgFilter类 public class LogFilter implements Filter { //FilterConfig可用于访问Filter的配置信息 private FilterConfig config; //实现初始化方法 public void init(FilterConfig config) { this.config = config; } //实现销毁方法 public void destroy() { this.config = null; } //执行过滤的核心方法 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,ServletException//创建一个doFilter 类,request参数是用于获取客户请求数据,response参数是用于发送响应数据,chain参数是过滤调用链。 { //---------下面代码用于对用户请求执行预处理--------- //获取ServletContext对象,用于记录日志 ServletContext context = this.config.getServletContext(); long before = System.currentTimeMillis();//是获得当前时间距离1970-1-1 00:00:00经过的毫秒数 System.out.println("开始过滤..."); //将请求转换成HttpServletRequest请求 HttpServletRequest hrequest = (HttpServletRequest)request;//把request强制类型转换为HttpServletRequest对象 //输出提示信息 System.out.println("Filter已经截获到用户的请求的地址: " + hrequest.getServletPath());//hrequest.getServletPath()是返回的是项目名到当前jsp文件的路径(意思就是在这个项目首页到文件的路径) //Filter只是链式处理,请求依然放行到目的地址 chain.doFilter(request, response);//调用下一个filter。 //---------下面代码用于对服务器响应执行后处理--------- long after = System.currentTimeMillis();//是获得当前时间距离1970-1-1 00:00:00经过的毫秒数 //输出提示信息 System.out.println("过滤结束"); //输出提示信息 System.out.println("请求被定位到" + hrequest.getRequestURI() + " 所花的时间为: " + (after - before));//hrequest.getRequestURI()是返回的整个URL的路径请求(意思就是返回的浏览器地址栏的整个地址) } }