作者:手机用户2502856237 | 来源:互联网 | 2023-08-15 20:55
在 Web 开发中,客户端与服务器端进行通信是以 HTTP 协议为基础的,而 HTTP 协议本 身是无状态的,无状态是指协议对于 事务处理 没有记忆能力。HTTP 无状态的特性严重阻碍了 WEB 应用程序的实现,毕竟交互是需要承前启后的,例如,典型的购物车程序需要知道用户到底在其他页面选择了什么商品。有两种用于保持 HTTP 连接状态的技术,它们是 Session和 COOKIE。
目录
1、session
2、COOKIE
1、session
session 对象是 javax.servlet.http.HttpSession 接口的实例对象。session 对象是 用 户 首 次 访 问 服务器时由服务器自动为其建的 , 在 JSP 中 可 以 通 过 调 用 HttpServletRequest 的 getSession(true)方法获得 session 对象。在服务器创建 session 对象的同时,会为该 session 对象生成唯一的 session id,在 Session 对象被创建之后, 就可以调用 session 的相关方法操作 session 对象的属性,当然,这些属性内容只保存在 服务器中,发到客户端的只有 session id;当客户端再次发送请求的时候,会将这个 session id 带上,服务器接受到请求之后就会依据 session id 找到相应的 session 对象, 从而再次使用它。正是这样一个过程,用户的状态也就得以保持了。 需要注意,只有访问 JSP、Servlet 等程序时才会创建 session 对象,只访问 HTML、 IMAGE 等静态资源并不会创建 session 对象。
session 对象的管理细节如下:
(1)新客户端向服务器第一次发送请求的时候,request 中并无 sessionidID 。
(2)此时,服务器端会创建一个 session 对象,并分配一个 sessionID,serssion 对象会保存在服务器端。此时 session 对象的状态处于 new state 状态,如果调用 session.isNew()方法,则返回 true。
(3)服务器端处理完毕后,将此 sessionID 随同 response 一起传回到客户端,并将其存入到客户端的 COOKIE 对象中。
(4)当客户端再次发送请求时,会将 sessionID 同 request 一起传送给服务器。
(5)服务器根据传递过来的 sessionID,将与该请求与保存在服务器端的 session 对象进行关联,此时,服务器上的 session 对象已再不处于 new state 状态,如果调用 session.isNew(),则返回 false。
Tomcat 中 Session 的默认超时时间为 30 分钟。可以通过修改 tomcat→conf→
conf/web.xm 中的,修改默认超时时间,单位为分钟,例如修改默认超
时时间为 60 分钟:
60
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+
request.getServerPort()+path+"/";
%>
<%--进行登录验证--%>
<% request.setCharacterEncoding("utf-8") ; //获取用户请求信息,首次请求是没有这些信息的,从页面填写信息提交后再次请求就有这些信息了。 String user = request.getParameter("user"); String password = request.getParameter("password"); if ("admin".equals(user) && "123".equals(password)) { request.getSession().setAttribute("username", user); //将用户名保存在 session 中 request.getSession().setAttribute("password", password); //将用户名保存在 session 中
%>
<% }
%>
<%=path %>
<%=basePath %>
<%@page import="java.text.SimpleDateFormat"%>
<%@page import="javax.xml.crypto.Data"%>
<%@ page cOntentType="text/html;charset=utf-8"%>
logok02当前用户(用户名从 session 中获取):
<%=request.getSession().getAttribute("username")%>
<%=request.getSession().getAttribute("password")%>
从 request 对象中获取了如下参数:
info=<%=request.getParameter("info")%>
user=<%=request.getParameter("user")%>
password=<%=request.getParameter("password")%>
<%SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");String CreatiOnTime=sdf.format(session.getCreationTime());%>CreatiOnTime=<%=CreationTime %>
返回登录页面
<%@ page cOntentType="text/html;charset=utf-8"%>
logok当前用户(用户名从 session 中获取):
<%=request.getSession().getAttribute("username")%>
<%=request.getSession().getAttribute("password")%>
从 request 对象中获取了如下参数:
info=<%=request.getParameter("info")%>
user=<%=request.getParameter("user")%>
password=<%=request.getParameter("password")%>
返回登录页面
2、COOKIE
COOKIE 也一种会话跟踪机制。COOKIE 对象虽然不是 JSP 的内置对象,使用时需要显 式创建该对象,但 JSP 设计时也经常使用 COOKIE 技术来实现一些特殊功能。
COOKIE 是 WEB 服务器通过浏览器在客户机的硬盘上存储的一小段文本,用来记录用户登录的用户名、密码、登录时间等信息。当用户下次再次登录此网站时,浏览器根据用户输入的网址,在本地寻找是否存在与该网址匹配的 COOKIE,如果有,则将该 COOKIE 和求参数一起发送给服务器做处理,实现各种各样的个性化服务。
COOKIE COOKIE =new COOKIE("username","Jack");
response.addCOOKIE(COOKIE);
读取客户端的 COOKIE 信息的方法如下:
JSP 通过调用 request.getCOOKIEs()从客户端读入 COOKIE 对象数组。再用循环语句 访问该数组的各个 COOKIE 元素,调用 getName()方法检查各个 COOKIE 的名字,直至找 到目标 COOKIE,然后对该 COOKIE 调用 getValue()方法取得与指定名字关联的值。
COOKIE 存取中文时可能会出现乱码,这是因为 COOKIE 文件是以 ASCII 编码格式存储 的,占 2 个字节,而中文则属于 Unicode 中的字符,占 4 个字符。所以,如果想在 COOKIE 中保存中文的话,必需得进行相应的编码后才能正确存储,读取时再解码。
保存时,使用 java.net.URLEncoder.encode(String s,String enc)对中文进行 编码
读取时,使用 java.net.URLDecoder.decode(String s,String enc)进行解码。
<%@page import="java.util.Date"%>
<%@page import="java.text.SimpleDateFormat"%>
<%@ page language="java" import="java.net.*" cOntentType="text/html; charset=UTF-8" %>
<%
COOKIE COOKIE = new COOKIE(URLEncoder.encode("姓名","UTF-8"), URLEncoder.encode("杰克","UTF-8")); COOKIE.setMaxAge(60*60); //设定该 COOKIE 在用户机器硬盘上的存活期为 1 小时 response.addCOOKIE(COOKIE); String userIp=request.getRemoteAddr();
COOKIE=new COOKIE("userIp",userIp);
COOKIE.setMaxAge(10*60); //设定 COOKIE 在用户机器硬盘上的存活期为 10 分钟 response.addCOOKIE(COOKIE); SimpleDateFormat sdf = new SimpleDateFormat("yyyy 年 MM 月 dd 日 h:m:s");
Date date=new Date();String logintime=sdf.format(date); COOKIE=new COOKIE("loginTime",URLEncoder.encode(logintime,"UTF-8"));
COOKIE.setMaxAge(20*60); //设定 COOKIE 在用户机器硬盘上的存活期为 20 分钟
response.addCOOKIE(COOKIE); out.print("成功保存了姓名、用户 IP 地址和登录时间到客户机的 COOKIE 中了!");
%>
去读取 COOKIE
<%@ page language="java" import="java.net.*" cOntentType="text/html; charset=UTF-8"%>
使用 foreach 循环读取 COOKIE 数组,并输出其中所有的 COOKIE:
<% if(request.getCOOKIEs()!=null){ for(COOKIE COOKIE : request.getCOOKIEs()){ String name =URLDecoder.decode(COOKIE.getName(),"UTF-8"); String value = URLDecoder.decode(COOKIE.getValue(),"UTF-8"); out.println("
COOKIE 属性:"+name+"="+value); } } %> 使用 for 循环,查找某个 COOKIE
<% COOKIE myCOOKIE[]=request.getCOOKIEs(); //创建一个 COOKIE 对象数组 COOKIE COOKIE=null; for(int i=0;i%> 你好,你的上次登录的 IP 地址是<%=COOKIE.getValue()%>!
<% } } %>