会话跟踪技术
问题:一次会话中的多次请求不会共享数据,不能显示.若通过传参数在路径上来解决该问题,不安全.
作用:解决HTTP无状态
http,cookie,session使用的区别
如果使用http中的request.setAttribute(),只能一次共享一个
若使用cookie,cookie存在浏览器中,每一次请求都会带上这个cookie
若使用session,里面的session存在服务器中,在这个会话中都能取到
cookie(客户端技术,里面携带的是属性,键值对)
1.cookie在服务端中创建
2.cookie从服务端 带到 浏览器
3.cookie最终存储在浏览器中
4.cookie共享数据的时间:再一次分文服务器资源时
5.cookie数据传递方向:浏览器–>服务器(cookie)–>浏览器(存入)–>服务器(获取cooKies)
cookie的基本使用
cookie特级别总结:
1.一个cookie只能在相同的域和路径下访问,有servlet访问和jsp访问
2.只需要在访问的servlet中new一个cookie对象,必须使用addCookie响应给浏览器才能奏效
3.获取到cookie里面的之后可以使用setvalue修改值
1.服务器创建cooKie对象
Cookie cookie = new Cookie(String name, String value);
name:共享数据的名称(唯一)
value:要共享的数据
2.服务器响应cookie给浏览器
resp.addCookie(cookie)
3.服务器获取cookie
浏览器发送请求时,会自动将cookie发送到服务器,此时cookie中有很多键值对
可以通过遍历获得想要的cookie
**getname:**获取一个cookie的名字
**getvalue:**获取cookie中的数据
Cookie[] cookies = req.getCookies();
在servlet中获取cookie数据
此时需要将数据继续共享,下一个地方才可以获得该数据
Cookie[] cookies = req.getCookies();
for (Cookie cookie : cookies) {
if ("username".equals(cookie.getName())){
System.out.println(cookie.getValue());
//共享数据到下一个页面
req.setAttribute("username",cookie.getValue());
}
}
在JSP中获取Cookie数据
使用El表达式
${cookie.username.value
修改cookie中的数据
需要调用cookie中的setValue方法
再重新创建同一个名称的cookie对象进行共享
Cookie[] cookies = req.getCookies();
for (Cookie cookie : cookies) {
if ("username".equals(cookie.getName())){
System.out.println(cookie.getValue());
//将服务器中的的cookie属性修改为muling
cookie.setValue("muling");
//将修改后的cookie对象重新响应给浏览器
resp.addCookie(cookie);
}
}
设置cookie的存活时间(以秒进行计算)
cookie默认的存活时间是当浏览器关闭的时候销毁
设置存活时间:cookie.setMaxAge(10)
立即删除当前cookie对象:cookie.setMaxAge(0)
cookie 的分类(在客户端中)
内存cookie:关闭浏览器消失
硬盘cookie:手工清理或到期
删除cookie
设置存活时间,一般是在中途删除cookie,要将删除后的cookie重新更新到浏览器
cookie.getMaxAge(0);
resp.addCookie(cookie);
cookie的域和路径的作用
让浏览器识别cookie并发送给服务器
域:识别服务器
路径:识别资源
cookie的应用场景
1.记录用户信息,解决HTTP无状态问题
2.登录时记住用户名
3.未登录实行购物车
cookie存在的问题
1.多个人使用同一台电脑不安全
2.tomcat8.5以下存中文麻烦\
3.一个cookie只能设一个值,String类型
4.服务器在客户端存的cookie数量有限
session(服务端技术,会话域)
1.在服务器创建
2.存在服务器
3.再一次访问服务器资源时实现数据共享
4.数据方向:浏览器–>服务器(session)–>数据在服务器
服务器识别不同用户session的方法
使用浏览器中cookie存储的sessionId来进行识别(使用会话cookie)
底层就是使用cookie传递session的id值
req
获取sesson
方法 | 作用 |
---|---|
req.getSession() | 判断是否存在session(浏览器是否携带了sessionId),有则获取,没有就重新创建 |
数据共享方法
方法 | 作用 |
---|---|
setAttribute(String name,Objiect value ) | 设置属性名和属性值 |
getAttribute(String name) | 获取共享的属性值 |
removeAttribute(name) | 从session中删除该属性值 |
invalidate() | 删除整个session对象 |
在servlet中获取Session数据
req.getSession.getAttribute(session)
在jsp中获取session数据
使用el表达式进行数据的获取,"user_in_session"是共享的session 名称,这样session的命名更规范
${user_in_session}
session的超时管理
默认情况下session只在tomcat]保留30分钟,超过设定得时间,所有的session就会销毁
在service()中设置超时管理,在实现共享数据之前
局部修改
修改web.xml文件,添加超时管理标签,时间按照分钟计算
<session-config>
<session-timeout>10</session-timeout>
</session-config>
局部修改
在创建servlet中的指定session下面添加超时管理,时间按秒计算
//使用session获取共享数据
HttpSession session = req.getSession();
//设置session超时时间,只要10秒钟之后还没有任何操作,此时销毁session,重新登录,在content页面操作的
session.setMaxInactiveInterval(10);
//仍然将数据共享出去
session.setAttribute("username",username);
servlet中的url重写
重写原因:用户故意禁用所有的cookie,session 就接收不到cookie所携带的sessionId
response.encodeURL("/session/list")
在jsp中url重写
${pageConttext.response.encodeURL("/session/list")}
重写url后,请求的url后面就会拼接jsessionId(可以自动检测是否开启cookie接收,未开启则自动拼接)
ionId
response.encodeURL("/session/list")
在jsp中url重写
${pageConttext.response.encodeURL("/session/list")}
重写url后,请求的url后面就会拼接jsessionId(可以自动检测是否开启cookie接收,未开启则自动拼接)