Session概念:
服务器会给每一个用户 创建一个Session对象
一个Session独占一个浏览器 只要浏览器不关闭 这个Session就一直存在
一个网站登录后 该网站的子页面可以直接访问 并且子页面中会保存用户的信息
Session和Cookie的区别
Cookie是把用户的数据写给用户的浏览器
在用户的浏览器保存(可以保存多个)
Session是把用户的信息写到用户独占的session域中
服务器端保存(存重要信息,避免服务器端资源浪费)
Session由服务器端创建
Cookie中setAttribute( String name, String value) 只能存入String类型
Session中setAttribute( String name, Object value) 可以存入 Object类型
Session使用场景
保存用户登录信息
比如 B站 我们登录之后 每次进入无需重新登录
Cookie流程
Cookie把资源存在本地 每次由用户向服务器端发送
Session流程
Session把资源存在服务器端 只给了用户身份铭牌 根据这张铭牌 获取资源
练习Demo
该类常用方法
创建Servlet类
public class Session extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf8");
resp.setCharacterEncoding("utf8");
resp.setContentType("text/html;charset=utf8");
PrintWriter out = resp.getWriter();
HttpSession session = req.getSession();
if(session.isNew()){
out.write("新创建的Session id为:"+session.getId());
}else{
out.write("之前的Session id为:"+session.getId());
}
session.setAttribute("name","潮汕奴仔");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
在web.xml注册此servlet
<!-- 注册servlet-->
<servlet>
<servlet-name>Session</servlet-name>
<servlet-class>com.csnz.servlet.Session</servlet-class>
</servlet>
<!-- 配置servlet的映射-->
<servlet-mapping>
<servlet-name>Session</servlet-name>
<url-pattern>/setSession</url-pattern>
</servlet-mapping>
启动服务器 访问
新建Servlet——GetSession类
public class GetSession extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf8");
resp.setCharacterEncoding("utf8");
resp.setContentType("text/html;charset=utf8");
PrintWriter out = resp.getWriter();
HttpSession session = req.getSession();
String name = (String) session.getAttribute("name");
out.write(name);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
注册Servlet
<!-- 注册servlet-->
<servlet>
<servlet-name>GetSession</servlet-name>
<servlet-class>com.csnz.servlet.GetSession</servlet-class>
</servlet>
<!-- 配置servlet的映射-->
<servlet-mapping>
<servlet-name>GetSession</servlet-name>
<url-pattern>/GetSession</url-pattern>
</servlet-mapping>
启动服务器 先访问GetSession
因为没有set直接get 服务器会报500 显示空指针异常
先访问set
再访问get
手动写 注销Session类
public class SessionOut 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);
}
}
注册Servlet
<!-- 注册servlet-->
<servlet>
<servlet-name>SessionOut</servlet-name>
<servlet-class>com.csnz.servlet.SessionOut</servlet-class>
</servlet>
<!-- 配置servlet的映射-->
<servlet-mapping>
<servlet-name>SessionOut</servlet-name>
<url-pattern>/SessionOut</url-pattern>
</servlet-mapping>
访问此注销页面
进行get
同样 我们可以使用在web.xml中配置Session失效的时间来控制Session的作用域
<!-- 设置Session有效时间-->
<session-config>
<!-- 默认1分钟后失效 这里是以分钟为单位-->
<session-timeout>1</session-timeout>
</session-config>
启动服务器访问set
一分钟后刷新get页面