JSP技术基础(5)( session、cookie 对象)

在 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 中的<session-config>,修改默认超时时间,单位为分钟,例如修改默认超
时时间为 60 分钟:
<session-config> 
<session-timeout>60</session-timeout> <!-- 单位:分钟 --> 
</session-config>
<%@ 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 中 
%> 

<jsp:forward page="logok02.jsp"> 
 <jsp:param name="info" value="logok02新人乍到,请多关照哦!"/> 
</jsp:forward> 
<% 
 } 
%> 
<html> 
<head> 
 
  </head> 
 <body><center> 
 <%=path %><br>
 <%=basePath %>
 <form action="login.jsp" method="post"> 
 <table> <tr><td colspan="2" ALIGN=“CENTER”>用户登录</td></tr> 
 <% //检查请求中是否有用户名和密码信息,//如有但不符要求则输出错误信息 
 if (null != user && null != password) { 
%> 
 <tr><td colspan="2">用户名或密码错误,请重新登录!</td></tr> 
 <% } %> 
 <tr><td>登录名:</td><td> <input type="text" name="user"></td> </tr> 
 <tr><td> 密码 </td><td><input type="password" name="password"></td></tr> 
 <tr><td colspan="2" ALIGN=“CENTER”><input type="submit" value=" 登 录
"></td></tr> 
 </table> 
 </form> 
 </center> 
 </body> 
</html>

 

<%@page import="java.text.SimpleDateFormat"%>
<%@page import="javax.xml.crypto.Data"%>
<%@ page contentType="text/html;charset=utf-8"%> 
<html> 
 <head><title>登录成功</title></head> 
 <body> 
 logok02
 当前用户(用户名从 session 中获取): 
<%=request.getSession().getAttribute("username")%> <br> 
<%=request.getSession().getAttribute("password")%> <br> 
 <p>从 request 对象中获取了如下参数:<br> 
 info=<%=request.getParameter("info")%><br> 
 user=<%=request.getParameter("user")%><br> 
 password=<%=request.getParameter("password")%><br> 
 <%
 SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
 String CreationTime=sdf.format(session.getCreationTime());

 %>
 CreationTime=<%=CreationTime %><br>
 <a href="logok.jsp">返回登录页面</a> 
 </body> 
</html>

 

<%@ page contentType="text/html;charset=utf-8"%> 
<html> 
 <head><title>登录成功</title></head> 
 <body> 
 logok
 当前用户(用户名从 session 中获取): 
<%=request.getSession().getAttribute("username")%> <br> 
<%=request.getSession().getAttribute("password")%> <br> 
 <p>从 request 对象中获取了如下参数:<br> 
 info=<%=request.getParameter("info")%><br> 
 user=<%=request.getParameter("user")%><br> 
 password=<%=request.getParameter("password")%><br> 
 <a href="logok02.jsp">返回登录页面</a> 
 </body> 
</html>

 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" %> 
<html> 
<title>Cookie-Save</title> 
<body> 
<% 
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 中了!"); 
%><br> 
<a href="cookieread.jsp">去读取 Cookie</a> 
</body> 
</html>
<%@ page language="java" import="java.net.*" contentType="text/html; charset=UTF-8"%> 
<html> 
 <title>Cookie-Read</title> 
<body> 
使用 foreach 循环读取 Cookie 数组,并输出其中所有的 cookie:<br> 
<% 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("<br>cookie 属性:"+name+"="+value); 
 } 
 } %> 
<p>使用 for 循环,查找某个 cookie<br> 
<% Cookie myCookie[]=request.getCookies(); //创建一个 Cookie 对象数组 
 Cookie cookie=null; 
 for(int i=0;i<myCookie.length;i++) //循环访问 Cookie 对象数组的每一个元素 
 {cookie = myCookie[i]; 
 if(cookie.getName().equals("userIp")){//查找名称为“userIp”的元素 
%> 
 你好,你的上次登录的 IP 地址是<%=cookie.getValue()%>! 
<% } } %> 
 </body> 
</html>

 

 

猜你喜欢

转载自blog.csdn.net/weixin_62190821/article/details/127327860