一.session相关知识
1.session
服务端会话技术,web应用为了识别客户端(用户)的身份,将客户端的信息保存在服务端(存在内存里);session可以用来存储信息
2.session的实现原理
session的实现依赖cookie,当客户端第一次访问服务端时,如果服务器用了session会生成cookie,cookie的key叫做JSESSION=xxx,生成之后将这个cookie发送给客户端,客户端就会存储这个cookie,客户端下次访问服务器时,客户端会携带这个cookie,服务器根据cookie的值(xxx)在内存中寻找,就识别到客户端
客户端<——>服务器(JSESSION=XXX)
二.获取session
1.创建MySession.java
package com.hhh;
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 MySession extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取session
//1.有参数:true,如果获取不到session,就会创建一个新的返回
//有参数,false,如果获取不到session,就会返回null
//2.没有参数,等同于传了true
HttpSession session = req.getSession(false);
System.out.println(session);
resp.getWriter().print("session");
}
}
2.在web.xml文件中配置servlet
<servlet>
<servlet-name>MySession</servlet-name>
<servlet-class>com.hhh.MySession</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MySession</servlet-name>
<url-pattern>/session</url-pattern>
</servlet-mapping>
3.参数为true时,运行效果
三.用session存储获取信息
1.session可以存储任意类型、任意大小的数据
session.setAttribute()存数据
session.getAttribute()取数据
2.先创建一个类为User
package com.hhh;
public class User {
private String name;
private int age;
//再创建它们的构造方法(Alt+Insert)
public User(String name, int age) {
this.name = name;
this.age = age;
}
//再生成set、get方法
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;
}
}
3.在MySession.java文件中,把User对象放进session里头,模拟登录过程
//将User对象放进session中,给session中存数据
session.setAttribute("currentUser",new User("hhh",20));
4.另外找一个servlet来获取session,新建SessionDemo.java文件,在里头写session获取数据的逻辑
package com.hhh;
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 SessionDemo extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取session
HttpSession session = req.getSession(false);
if(null==session){
resp.getWriter().print("session is null");
}else{
//先是获得Object对象,后进行强转,为User对象
User currentUser =(User) session.getAttribute("currentUser");
System.out.println(currentUser);
}
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().print("获取session成功");
}
}
5.在web.xml文件中配置servlet
<servlet>
<servlet-name>SessionDemo</servlet-name>
<servlet-class>com.hhh.SessionDemo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SessionDemo</servlet-name>
<url-pattern>/sessionDemo</url-pattern>
</servlet-mapping>
6.启动tomcat,运行效果如下
1.先访问MySession.java,往session里放东西
2.再访问SessionDemo.java,获取session信息
四.关闭浏览器后session的保持和销毁
1.默认情况下,第一次访问后关闭客户端(浏览器),服务器不关,再次访问session不能访问到。
2.session实现依赖cookie,cookie默认情况下浏览器关闭后就会被清空,所以下次访问时,没有对应的cookie。
3.利用cookie(JSESSION=XXX)持久化至本地,下次访问时会带上这个cookie
1.在MySession.java文件中添加部分代码
package com.hhh;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.io.IOException;
public class MySession extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取session
//1.有参数:true,如果获取不到session,就会创建一个新的返回
//有参数,false,如果获取不到session,就会返回null
//2.没有参数,等同于传了true
HttpSession session = req.getSession(true);
//将User对象放进session中,给session中存数据
session.setAttribute("currentUser",new User("hhh",20));
System.out.println(session);
//把标识session的cookie持久化到客户端的本地,这里cookie的值要与session产生关联
Cookie cookie=new Cookie("JSESSIONID",session.getId());
//cookie持久化
cookie.setMaxAge(180);
resp.addCookie(cookie);
resp.getWriter().print("session");
}
}
2.启动tomcat,按F12查看
3.执行SessionDemo.java代码
4.关闭浏览器,重新执行SessionDemo.java代码,依旧可以获取session信息
4.session的销毁
1.服务器关闭
2.调用了session的失效方法
3.到了session的失效时间,默认30分钟
可以在web.xml文件中配置
<session-config>
<session-timeout>30</session-timeout>
</session-config>