会话技术
会话可以简单理解为,一个用户打开一个浏览器,在同一个WEB应用上,点击多个超链接,访问多个WEB资源,然后关闭浏览器,那这整个过程我们称之为一个会话
作用:
会话技术可以保存用户在会话过程中所产生的数据
会话技术也可以让用户在同一个会话中实现数据的共享
会话技术的分类:
1.cookie
- cookie是一种客户端技术,程序可以把每一个用户特有的数据,以响应头set-cookie发送给每一个用户的浏览器,那最终会以文件的形式保存在用户的硬盘上
- 当用户再次使用浏览器来访问我们的WEB服务器,用户的浏览器会带上他特有的数据,而我们的程序所处理的则是来访用户特有的数据。
2.session
- session是一种服务器技术,WEB服务器会在运行时为每一个用户的每一个会话创建一个其独享的HttpSession对象
- 由于session对象是用户独享的,所以我们可以使用session对象来保存用户在一个会话过程中所产生的数据。
- session对象也是一个域对象,范围是整个会话
- WEB服务器可以为每一个来访的用户浏览器创建一个会话对象(session对象)
- 如果需要保存用户的数据,我们的程序可以把用户的数据保存在用户浏览器独享的session对象中
- 如果用户再次的使用浏览器来访问其他的WEB资源,其他的WEB资源也可以通过session对象来获取这个用户的数据,以便为这个用户再次的服务
- session对象由WEB服务器创建,我们可以通过请求对象的方法getSession()来获取。
session的有效期:
默认30分钟内有效但是可以在web.xml中配置有效期
<!--设置session超时时间为1分钟-->
<session-config>
<session-timeout>1</session-timeout>
</session-config>
Cookie的常用方法
-
构造方法
Cookie(String name,String value); -
获取名称
String getName(); -
获取值
String getValue(); -
设置有效时间(过期时间)
void setMaxAge(int expiry) -
设置路径
void setPath(String uri)
Session的常用方法:
- 获取ID
String getId() - 是否为新的session
bollean isNew() - 存入键值对
Session.setAttribute() - 获取键值对
Session.getAttribute() - 移除Session中的键值对
Session.removeAttribute()
cookie和session的区别
cookie:
是一种客户端技术,有大小和数量的限制,把数据保存在客户端,所以相对的不安全
session:
是一种服务器端技术,没有大小和数量的限制,把数据保存在服务器端,所以相对的安全
新建cookie会话
@WebServlet(name = "CookieServlet",urlPatterns = "/CookieServlet")
public class CookieServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.创建Cookie
Cookie cookie = new Cookie("uname", "admin");
Cookie cookie1 = new Cookie("passwd", "123");
//2.将Cookie对象添加到response
response.addCookie(cookie);
response.addCookie(cookie1);
//3.向浏览器打印cookie creat success
response.getWriter().println("cookie creat success");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
在浏览器观察cookie否被写入
cookie解决中文乱码问题:
//添加cookie时
Cookie cookie2 = new Cookie(URLEncoder.encode("年龄","utf-8"), "14");
//提取cookie时
URLDecoder.decode(cookie.getName(),"utf-8")+"\t"+cookie.getValue();
在servlet中获取cookie键值对:
@WebServlet(name = "TestCookieSevlet",urlPatterns = "/TestCookieSevlet")
public class TestCookieSevlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie[] cookies = request.getCookies();
for (Cookie cookie:cookies){//便利cookies集合
response.getWriter().println(URLDecoder.decode(cookie.getName(),"utf-8")+"\t"+cookie.getValue());//解决中文乱码
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
**
新建session
**
@WebServlet(name = "SessionServlet",urlPatterns = "/SessionServlet")
public class SessionServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取session
HttpSession session = request.getSession();
//获取session的id
String id = session.getId();
response.getWriter().println("id:"+id);
//判断session是否为新的session
boolean aNew = session.isNew();
response.getWriter().println("isnew:"+aNew);
//向session中存入键值对
session.setAttribute("age",12);
//获取session中的age
Integer age = (Integer) session.getAttribute("age");
response.getWriter().println("age"+age);
//移除session中的age
session.removeAttribute("age");
age=(Integer) session.getAttribute("age");
response.getWriter().println(age);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
每一个浏览器访问服务器的session的id不同,同一个浏览器第二次访问session.istrue变为false
测试结果: