request 请求的特点:只存在一次请求中
http协议是一个无状态的协议【对事物的处理没有记忆能力】所以产生了会话
web应用中的会话及管理
一,会话cookie,
临时cookie存在于浏览器进程中,
创建一个cookie
Cookie usercookie=new Cookie("username","鱼翔空");
持久cookie
//设置在客户端的时间,保存7天
usercookie.setMaxAge(7*24*60*60);
//放置cookie到应答头,从服务端存放到客户端
response.addCookie(usercookie);
读取cookie
Cookie[] cookies=Cookie.getCookies(); if(cookies!=null&&cookies.length>0) { for(Cookie cookie:cookies) cookie.getName(); }
设置cookie能返回给服务器的路径,将cookie保存在web应用程序的根目录,这样这个web应用中都可以使用到该cookie
usercookie.setPath(request.getContextPath());
设置cookie读取路径的原因
a) 默认cookie写入的读取路径是当前操作的目录下
b) 只有当前目录下的web程序才可以去访问当前的cookie
c) 如果网站的上级目录程序要访问当前的cookie会访问不到
d) 所以要设置读取cookie的路径为网站的根目录
用cookie记录访问时间,将时间已字符串的形式保存在cookies中
在cookie中设置时间时,在时间的字符串中不能出现空格" "或":"等特殊的符号,但"-"可以
案例使用cookie记住用户名和密码
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); //获取用户名和密码 String username=request.getParameter("username"); String psw=request.getParameter("psw"); Cookie userCookie=null; Cookie pswCookie=null; //创建Cookie if(username!=null&&!"".equals(username.trim())){ userCookie=new Cookie("username",java.net.URLEncoder.encode(username, "utf-8")); } if(psw!=null&&!"".equals(psw.trim())){ pswCookie=new Cookie("psw",java.net.URLEncoder.encode(psw,"utf-8")); } //保存用户名和密码:<input type='checkbox' name='save' value='yes' ><br> String save=request.getParameter("save"); if(save!=null){ //表示复选框被选中 if(userCookie!=null&&pswCookie!=null){ //设置Cookie的保存时间 //将最大时效设为0则是命令浏览器删除该cookie。 userCookie.setMaxAge(7*24*60*60); pswCookie.setMaxAge(7*24*60*60); } }else{ //save==null:表示复选框没有被选中,用户名和密码在客户端的浏览器中不被保存 if(userCookie!=null&&pswCookie!=null){ //设置Cookie的保存时间 //将最大时效设为0则是命令浏览器删除该cookie。 userCookie.setMaxAge(0); pswCookie.setMaxAge(0); } } if(userCookie!=null&&pswCookie!=null){ //加入Cookie到应答头 response.addCookie(userCookie); response.addCookie(pswCookie); } }
字符编码问题
编码java.net.URLEnconder.encode("用户名","utf-8")
解码java.net.URLDeconder.decode("用户名","utf-8")
二,会话session
获取session的三种方法
HttpSession session=request.getSession(true); HttpSession session=request.getSession(false); HttpSession session=request.getSession();
true 如果和request关联的session存在,获取已存在的session
如果和request关联的session不存在,创建一个新的session
false 如果和request关联的session存在,获取已存在的session
如果和request关联的session不存在,不会创建新的session
request.getSession();取出的结果和getSession(true)相同
Sessionid的存储方式:
采用cookie存储,称之为session cookie
如果cookie在客户端被禁止,则采用url重写
一种是作为URL路径的附加信息,http://www.yxkong.com:Jsessionid=内容?参数
一种是作为查询字符串附加在URL后面,com?jsessionid=内容
response.encodeURL("url路径地址")
服务器会根据客户端的游览器是否支持cookie来处理是否重写url
encodeRddirectURL("url地址")用法同上
表单隐藏字段,使用隐藏域来保存
session中的常用方法
session.geid()返回SessionID
session.getLastAccessedTime()//获得session的最后访问时间
session.setAttribute("属性key",属性名);
session.getAttribute("属性key");获得session值
session.removeAttribute("属性key"),删除属性
session.getCreationTime() 获得session对象的创建时间
session.getMaxInactiveInteral()//获得session的最大超时时间秒
isNew(),判断session判断是否是新创建的Session
session.getLastAccessedTime()最后一次操作时间
request.getHttpSession(boolean) 获得HttpSession对象
setAttribute(String,Object)将一对属性保存在httpSession对象中
getAttribute(String)根据name返回httpSession对象中所有的属性值
removeAttribute(String)
getAttributeNames() 返回http对象中所有的属性名
session.invalidate()//注销session
setMaxInactiveInterval();设置最大超时时间
设置session的过期时间
直接在读写session时,配置session的超时时间,优先级最高
setMaxInactiveInterval(5)
可以在服务器中的web.xml中配置整个服务器中的session超时时间,
也可以在web项目下配置该项目的session超时时间,一般用这个
<session-config> <sesstion-time>10</sesstion-time> </session-config>
sessionid 不能实现跨游览器共享
ie6下session不共享每次开启一个ie6窗口都会创建一个新的session
//在ie6下实现跨窗口共享,是将sessionid保存到持久cookie中
Cookie cookie=new Cookie("JSESSIONID",session.getId()); cookie.setMaxAge(24*60*60); response.addCookie(cookie);
当游览器不支持cookie的时候,可以通过url重写解决
response.encodeURL("url路径地址")
服务器会根据客户端的游览器是否支持cookie来处理是否重写url
encodeRddirectURL("url地址")用法同上
Session存放数据应注意:
session存放的对象时,是对象的引用,当修改过对象的值以后不需要再存入到session对象中
session中尽量少的存放数据,如果能放到request中的尽量放入request
session中存放的数据量应该尽可能的减小,防止session过大,给服务器增加压力,也会减少session丢失
Session清空的方法:
1) 人为的使用代码清空session
2) 过了session的保存时间
3) Session是浏览器/服务器进程,关闭浏览器以后服务器将清空session(两端之间没有不间断的http通信,没有联系等到session的过期时间就会清空).
浏览器访问服务器端使用同一个session是由两端的sessionid来维系的
当访问服务器的时候,服务器会返回一个sessionid当浏览器得到这个 sessionid会将它放在自己的进程内存里,这里不同的浏览器会有所不同,IE6进程间不能共享这个sessionid,也就是新开一个IE将不能共享这个sessionid;而Firefox进程间可以共享.然后你继续发请求给这个网站的时候,浏览器就会把这个sessionid放在请求头里发送给该服务器了,这样服务器得到sessionid后再和自己内存里存放的sessionid对比锁定客户端,从而区分不同客户端,完成会话.
可以看出如果用这种方式,当用户在会话的过程中关闭浏览器结束进程,则这个sessionid将消失,如果用户又打开浏览器想继续这次会话的时候,就会因为发送的请求中没有这个sessionid而使服务器无法辨别该把那个session信息给他,注意(这个时候服务器端的sessionid和 sessionid所指向的session都还存在,只是没有正确的sessionid和它匹配而占用服务器内存,只有session过期或服务器重启才释放内存).
上面这种方式叫会话cookie,把cookie放在浏览器内存里,只能在这个浏览器的内存范围里完成会话,是一种不长久的方式,为了能长久会话,就出现了持久化cookie,把cookie固化在用户的计算机上,现在的cookie不单单能存放sessionid,还能放用户信息,样式表信息等.
如果用户禁止了所有cookie的使用,那么会话cookie和持久化cookie都不能用了,有个方案也可以解决问题,就是URL重写,这里要说下的就是URL重写只能实现会话cookie的效果,持久会话实现不了.
文章评论