Servlet学习之会话技术

来源:互联网 发布:魔兽争霸mac版百度云 编辑:程序博客网 时间:2024/05/16 19:06

会话技术:在一次会话中共享数据

会话:一次谈话,在web中,指的是浏览器和服务器的一次通信,这次通信可以包含多次请求和多次响应,并且可以在多次请求和多次响应间共享数据

会话技术:客户端会话技术,服务端会话技术

1.客户端会话技术:Cookie

1.1 特点:数据存在客户端,不安全,服务器压力不大

(1)cookie持久化问题

(2)不能跨浏览器

(3)不支持存储中文数据(如若存储需要编码+解码)

(4)键和值都是字符串

1.2 原理:浏览器第一次请求服务时,服务器响应,会将数据通过set-cookie头携带回去,保存在浏览器;第二次请求时,通过cookie头将数据再携带回来

1.3代码如下:

package LoginServletDemo;import java.io.IOException;import java.net.URLDecoder;import java.net.URLEncoder;import javax.servlet.ServletException;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class MyServlet1 extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//创建Cookie对象//Cookie cookie = new Cookie("name", "Taylor");//如果出现中文String name = "泰勒";//用URLEncoder进行编码String encode = URLEncoder.encode(name, "utf-8");Cookie cookie = new Cookie("name", encode);//设置cookie持久化cookie.setMaxAge(60*60*60*30); 数据存在客户端的硬盘上,存活30天//响应response.addCookie(cookie);//判断Cookie[] cookies = request.getCookies();if(cookies != null){for(Cookie c : cookies){if(c.getName().equals("name")){String value = c.getValue();//用URLDecoder解码value = URLDecoder.decode(value, "utf-8");System.out.println(value);}}}}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {this.doGet(request, response);}}

2.客户端会话技术:Session

2.1 特点:数据存在服务端,安全,服务器压力大

session会话域:可以在多次请求和多次响应间共享数据

(1)如果浏览器关闭:jsessionid 不一样了,session,对象也不一样了

(2)正常关闭服务器:jsessionid 一样的 ,对象不一样了,能取出数据

钝化:正常关闭时服务器将session对象序列化到硬盘上

活化:服务器开启时会将session读回来

2.3session的生命周期

(1)声明时候创建 getSession()

HttpSession session= request.getSession()

(2)销毁 session 超时30分钟就会自动销毁:<session-timeout>30</session-timeout>

让session立马死掉:

session.invalidate(); cookie.setMaxAge(0);

2.2 原理:依赖cookie技术,当浏览器请求服务器时,服务器会创建session

2.4代码如下:

package LoginServletDemo;import java.io.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;public class MyServlet2 extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//浏览器请求服务器时创建SessionHttpSession session = request.getSession();session.setAttribute("num", "125");String id = session.getId();System.out.println(session);//org.apache.catalina.session.StandardSessionFacade@451710beSystem.out.println(id);//008B85F62E185088B77D353FA7EBA4D6}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {this.doGet(request, response);}}
package LoginServletDemo;import java.io.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;public class MyServlet3 extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {HttpSession session = request.getSession();String value = (String) session.getAttribute("num");String id = session.getId();//1.如果浏览器关闭了:jsessionid 不一样了,session,对象也不一样了//2.正常关闭服务器:jsessionid 一样的 ,对象不一样了,能取出数据System.out.println(value);System.out.println("session2:"+session);System.out.println("id2:"+id);}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {this.doGet(request, response);}}

2.5域的选择

session会话域:可以在多次请求和多次响应间共享数据

request 请求域:在一次请求和一次响应间共享数据

如果说是一次性数据 你就选request

如果你要想数据在多个页面间使用,你只能选session

如果你用了重定向跳转页面,那你共享的数据最好选用session 备选ServletContext

如果你用请求转发跳转页面,你可以选request session 备选ServletContext