会话
会话:用户打开一个浏览器,点击了很多超链接,访问多个web资源,最后关闭浏览器,整个这个过程可以称之为会话。
有状态会话:
一个网站,怎么证明你来过?
客户端 服务端
1.服务端给客户端一个信件,客户端下次访问服务端带上信件就可以了; cookie
2.服务器登记你来过了,下次你来的时候我来匹配你; session
保存会话的两种技术:
cookie:
客户端技术(响应、请求)
session:
服务器技术,利用这个技术,可以保存用户的会话信息?我们可以把信息或者数据放在Session中!
常见场景:网站登录之后,你下次不用再登录了,第二次访问直接就上去了!
Cookie:
1.从请求中拿到cookie信息
2.服务器响应给客户端cookie
//保存用户上一次访问的时间
public class CookieDemo01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//服务器,告诉你来的时间,把这个时间封装成一个信件,你下次来的时候带过来,服务器就知道你来了
//解决中文乱码
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
PrintWriter out = resp.getWriter();
//Cookie 服务器端从客户端获取
Cookie[] cookies = req.getCookies();//这里返回数组,说明Cookie可能存在多个
//判断cookies是否存在
if(cookies!=null){
//如果存在怎么办
out.write("你上一次访问的时间是:");
for(int i = 0;i<cookies.length;i++){
Cookie cookie = cookies[i];
//获取cookie的名字
if(cookie.getName().equals("lastLoginTime")){
//获取cookie中的值
long lastLoginTime=Long.parseLong(cookie.getValue());
Date date = new Date(lastLoginTime);
out.write(String.valueOf(date));
}
}
}else {
out.write("这是你第一次访问本站");
}
//服务器给客户端响应一个cookie
Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis()+"");
//设置cookie有效期为一天
cookie.setMaxAge(24*60*60);
resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
获得cookie
Cookie[] cookies = req.getCookies();//获得cookie
cookie.getName();//获得cookie的key
cookie.getValue();//获得cookie的value
new Cookie(key,value);//新建一个cookie
cookie.setMaxAge();//设置cookie的有效期
resp.addCookie(cookie);//响应给客户端一个cookie
cookie:一般会保存在本地的用户目录下appdata;
public class CookieDemo02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//创建一个cookie,名字必须要和要删除的名字一致
Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis()+"");
//将cookie有效期设置为0,即立刻过期
cookie.setMaxAge(0);
resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
运行上段代码可以将demo1的cookie删除掉
中文数据的传递
//中文数据传递
public class CookieDemo03 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决中文乱码
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
PrintWriter out = resp.getWriter();
//Cookie 服务器端从客户端获取
Cookie[] cookies = req.getCookies();//这里返回数组,说明Cookie可能存在多个
//判断cookies是否存在
if(cookies!=null){
//如果存在怎么办
out.write("你上一次访问的时间是:");
for(int i = 0;i<cookies.length;i++){
Cookie cookie = cookies[i];
//获取cookie的名字
if(cookie.getName().equals("name")){
//获取cookie中的值
//System.out.println(cookie.getValue());
out.write(cookie.getValue());
}
}
}else {
out.write("这是你第一次访问本站");
}
Cookie cookie = new Cookie("name","爪哇");
resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
如此设置可以防止中文乱码
Session(重点):
什么是Session:
1、服务器会给每一个用户(浏览器)创建一个Seesion对象;
2、一个Seesion独占一个浏览器,只要浏览器没有关闭,这个Session就存在;
3、用户登录之后,整个网站它都可以访问啊! —》保存用户的信息;保存购物车的信息
Session和Cookie的区别:
Cookie是把用户的数据写给用户的浏览器,浏览器保存(可以保存多个)
Session把用户的数据写到用户独占Session中,服务器端保存。(保存重要的信息,减少服务器资源的浪费)
Session对象由服务创建;
使用场景:
1、保存一个登录用户的信息;
2、购物车信息;
3、在整个网站中经常会使用的数据,我们将它保存在Session中;
利用Session传递参数:
public class SessionDemo01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决乱码问题
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=utf-8");
//得到Session
HttpSession session = req.getSession();
//给Session中存放信息
session.setAttribute("name","爪哇");
//获取Session的ID
String sessionId = session.getId();
//判断Session是不是新创建
if(session.isNew()){
resp.getWriter().write("session创建成功,ID"+sessionId);
}else{
resp.getWriter().write("session已经在服务器中存在了,ID"+sessionId);
}
//Session创建的时候做了什么事情:
// Cookie cookie = new Cookie("JSESSIONID",sessionId);
// resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
public class SessionDemo02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决乱码问题
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=utf-8");
//得到Session
HttpSession session = req.getSession();
//获取Session的信息
String name = (String) session.getAttribute("name");
System.out.println(name);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
并在web.xml内正确注册之后:
先跑s2是没有参数的,得跑s1之后才会在session内创建参数,然后s2才能获取。
利用Session传递对象:
创建一个Person对象
package com.jxr.pojo;
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
在s1和s2中修改代码,适应传递的对象:
分别执行后,发现session成功传递对象:
Session的注销:
public class SessionDemo03 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
session.removeAttribute("name");
session.invalidate();//注销
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
执行s1,s3,s2之后
找不到session了,因为session在s3中已经被注销
在运行s1,会得到一个新的session
在web.xml内可以设置自动注销时间
<!-- 设置Session默认的失效时间 -->
<session-config>
<!-- 1分钟后,Session自动生效,以分钟为单位-->
<session-timeout>1</session-timeout>
</session-config>