问:说说session的原理和你对它的理解?
1.session的运行范围
session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。
2.session的创建、关闭、删除
创建时间:直到某server端程序调用HttpServletRequest.getSession(true) | request.getSessoin();这样的语句时session才被创建,注意如果JSP没有显示的使用 关闭session,则JSP文件在编译成Servlet时将会自动加上这样一条语句HttpSession session = HttpServletRequest.getSession(true).
由于session会消耗内存资源,因此,如果不打算使用session,应该在所有的JSP中关闭它。
JSP关闭session:(1)<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"session="false"%>
删除session/失效session:
a.程序调用HttpSession.invalidate();
b.距离上一次收到客户端发送的session id时间间隔超过了session的超时设置;
c.服务器进程被停止(非持久session)
3.一般情况下,session都是存储在内存里,当服务器进程被停止或者重启的时候,内存里的session也会被清空,如果设置了session的持久化特性,服务器就会把session保存到硬盘上(这个保存是把内存中的session复制一份到本地),当服务器进程重新启动或这些信息将能够被再次使用.
4.如何做到在浏览器关闭时删除session
严格的讲,做不到这一点。可以做一点努力的办法是在所有的客户端页面里使用javascript代码window.oncolose来监视浏览器的关闭动作,然后向服务器发送一个请求来删除session。但是对于浏览器崩溃或者强行杀死进程这些非常规手段仍然无能为力。
5.当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识- 称为session_id,如果已包含一个session_id则说明以前已经为此客户端创建过session,服务器就按照session_id把这个session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含session_id,则为此客户端创建一个session并且生成一个与此session相关联的session_id,session_id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。 保存这个session_id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发挥给服务器。一般这个cookie的名字都是类似于SEEESIONID.而由于cookie可以被人为的禁止,必须有其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。经常被使用的一种技术叫做URL重写,就是把session id直接附加在URL路径的后面,附加方式也有两种,一种是作为URL路径的附加信息,另一种是作为查询字符串附加在URL后面(采用第一种方式有利于把session id的信息和正常程序参数区分开来)。
问:说说cookie的原理和你对它的理解?
cookie是基于客户端的技术,正统的cookie分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie。然而纯粹的客户端脚本如JavaScript或者VBScript也可以生成cookie。
而cookie的使用是由浏览器按照一定的原则在后台自动发送给服务器的。浏览器检查所有存储的cookie,如果某个cookie所声明的作用范围大于等于将要请求的资源所在的位置,则把该cookie附在请求资源的HTTP请求头上发送给服务器。
cookie分为两种类型,一种为会话cookie,一种为持久cookie。会话cookie存储在浏览器内存中,当浏览器关闭的时候,会话cookie就会消失。持久cookie是保存在硬盘中。如果不设置cookie的最大存活时间的时候(new Cookie().setMaxAge()),就为会话cookie,如果设置了最大存活时间,那么这时cookie将会变成持久cookie。浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间。
如果要删除cookie,那么就只要将其最大生存时间设置为0即可;但是此时必须注意,cookie的路径path必须相同,否则不能删除指定的cookie。
问:说说session和cookie的区别?
问:用户禁用cookie的时候如何使用session?
经常被使用的一种技术叫做URL重写,就是把session id直接附加在URL路径的后面,附加方式也有两种,一种是作为URL路径的附加信息,另一种是作为查询字符串附加在URL后面(采用第一种方式有利于把session id的信息和正常程序参数区分开来)。
问:如何不用session实现用户登录和购物车?
问:如何实现同一应用程序分布部署的时候session同步?
方案一:
问:如何实现不同应用程序的session共享?
问:开两个浏览器窗口访问应用程序会使用同一个session还是不同的session
对session来说是只认id,因此不同的浏览器,不同的窗口打开方式以及不同的cookie存储方式都会对这个问题的答案有影响。
问:如何防止用户打开两个浏览器窗口操作导致的session混乱?
这个问题与防止表单多次提交是类似的,可以通过设置客户端的令牌来解决。就是在服务器每次生成一个不同的id返回给客户端,同时保存在session里,客户端提交表单时必须把这个id也返回服务器,程序首先比较返回的id与保存在session里的值是否一致,如果不一致则说明本次操作已经被提交过了。可以参看《J2EE核心模式》关于表示层模式的部分。需要注意的是对于使用javascript window.open打开的窗口,一般不设置这个id,或者使用单独的id,以防主窗口无法操作,建议不要再window.open打开的窗口里做修改操作,这样就可以不用设置。