浅谈Session技术
我们通常会将Cookie和Session作为一个组来一起学习。他们之间存在着很大的共同点;
在百度百科中,这样对Cookie和Session定义:
Cookie:类型为“小型文本文件”,是某些网站为了辨别用户身份,进行Session跟踪而储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息。(关键字:客户端)
Session:称为“会话控制”。Session对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web页时,如果该用户还没有会话,则Web服务器将自动创建一个 Session对象。当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。(关键字:服务器)
Session和Cookie的区别:
-
Cookie是把用户的数据写给客户端浏览器,由客户端浏览器进行保存,并且可以有多个Cookie,成为Cookies;
-
Session是把用户的数据写到用户独占的Session中,由服务器端进行保存,并且为了不对服务器资源进行浪费,Session只保存一些比较重要的数据;
-
Session对象是由服务创建的。
Session的使用场景
-
-
保存购物网站的购物车信息;
-
在使用某网站时经常需要使用到的数据,也将其保存在Session中。
代码示例
获取Session信息:
package psl.wong.servlet; 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; import java.io.PrintWriter; public class SessionDemo01 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //解决浏览器乱码问题 req.setCharacterEncoding("GBK"); resp.setCharacterEncoding("GBK"); PrintWriter writer = resp.getWriter(); //创建一个Session HttpSession session = req.getSession(); //给Session中存东西 session.setAttribute("name","Hayden-wong"); //获取Session的ID String sessionId = session.getId(); //判断是否是一个新的Session if (session.isNew()){ writer.write("这是一个新的Session,刚刚创建成功了,ID:"+sessionId); }else{ writer.write("服务器已经存在此Session,ID:"+sessionId); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
设置session的手动过期:
package psl.wong.servlet; 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; //移除Session public class SessionDemo02 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); } }
设置session的自动过期(由web.xml实现):
<!--设置session自动注销--> <session-config> <!--X分钟后session自动失效,以分钟为单位的。--> <session-timeout>1</session-timeout> </session-config>