1、Sessio(会话):就是从打开浏览器到关闭浏览器即为一次会话,只要浏览器不关闭Session就不会消失,Sessio可以用来保存用户的信息。比如:你用Chrome浏览器打开了B站,并且进行了登录,如果你关闭了B站的窗口然后过一会再次打开B站主页面的时候,你会发现你的用户仍然处于登录状态。
2、服务器会给每一个用户(浏览器)创建一个Session,打开两个浏览器(Chrome、Edge)就是两个用户。
3、Sessio简单代码:
session.setAttribute("name","小明") 用来存String类型,session.setAttribute(String ,Object)还可以存对象(下面写)。setAttribute(String ,Object)方法除了session可以调用,ServletContext context对象也可以用,context.setAttribute(String ,Object)。session.getAttribute()返回的是Object。
public class Session01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 解决乱码
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创建成功"+sessionId);
}else {
resp.getWriter().write("session已经在服务器上创建了,ID为:"+sessionId);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
public class Session02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 解决乱码
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
// 获取Session对象
HttpSession session = req.getSession();
//获取Session对象存的东西
String name = (String) session.getAttribute("name");
resp.getWriter().print("session获得的东西"+name);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
web.xml
<servlet>
<servlet-name>Session01</servlet-name>
<servlet-class>com.iflytek.servlet.Session01</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Session01</servlet-name>
<url-pattern>/s1</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>Session02</servlet-name>
<servlet-class>com.iflytek.servlet.Session02</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Session02</servlet-name>
<url-pattern>/s2</url-pattern>
</servlet-mapping>
session.setAttribute(Object)
public class Person {
private String name;
private int age;
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
运行结果:
<!-- 设置session默认失效时间 以分钟为单位-->
<session-config>
<session-timeout>1</session-timeout>
</session-config>
(web.xml中配置)
用户一段时间没有登录,服务器就会默认让session小时,不认session一直存在服务器量太大,易崩。
4、Session和Cookie的区别:
Cookie:用户的数据写给用户的浏览器,浏览器保存。
Session:用户的数据写给session,服务器保存。Session对象时服务器创建,获取对象时是request请求 HttpSession session = req.getSession();
使用场景:
保存用户登录信息、保存购物车信息、在整个网站中经常会使用的数据。