JavaEE---Servlet会话跟踪之Cookie

本文深入探讨了JavaWeb环境下Cookie的创建、使用及管理,通过实例展示了如何利用Cookie进行用户状态持久化,并详细解释了Cookie生命周期、安全性及如何避免常见错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文的书写参考自电子工业出版社的《Java Web程序设计》第二章第一节。

1、Cookie的创建和使用

Cookie userCookie = new Cookie("userName",userName);

两个参数分别指定了Cookie的属性名称和属性值。此外,Cookie还有其他的方法供调用:

getMaxAge()/setMaxAge() 指的是读取或者设置Cookie的过期时间,如果使用setMaxAge()方法设置了一个负值,则表示该Cookie在用户退出浏览器之后马上过期,如果setMaxAge()指定了一个0值,则表示删除此Cookie.

getValue()和setValue() 指的是读取/设置Cookie的属性值

getComment()和setComment()指读取或设置注释。


创建完成的Cookie对象,就可以使用HttpServletResponse的addCookie()方法将其发送到客户端。

当然使用HttpServletRequest的getCookies()方法可以从客户端获得这个网站的所有Cookie,该方法返回一个包含本站所有Cookie的数组,遍历该数组就可以获得对应的Cookie。


默认情况下,Cookie在客户端是保存在内存中的,如果浏览器关闭,Cookie也就失效了。如果想要让Cookie长久地保存在磁盘上,可以使用setMaxAge()方法设置其过期的时间为正数。比如设置某个Cookie的过期时间为1周则可以用:userCookie.setMaxAge(7 * 24 * 60 * 60);


2、实际开发例子

(1)编写用于接收用户输入的HTML表单文件。一般来说,我们登陆页面都是使用HTML写的,但是这里却没有直接使用,而是使用了一个Servlet来完成此功能。原因是需要通过Servlet去读取客户端的Cookie,HTML并无法完成此功能。JSP是Servlet的前身,所以可以完成Servlet的工作,所以登录页面也可以使用JSP写。

代码如下:

package servlet;

import java.io.IOException;
import java.io.PrintWriter;

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 LoginServlet extends HttpServlet{
    public void doGet(HttpServletRequest request,HttpServletResponse response)
    throws ServletException,IOException{
    	String cookieName = "userName";
    	String cookiePwd = "pwd";
    	Cookie[] cookies = request.getCookies();
    	String userName = "";
    	String pwd = "";
    	String isChecked = "";
    	if(cookies != null){
    		isChecked = "checked";
    		for(int i = 0; i < cookies.length; i++){
    			if(cookies[i].getName().equals(cookieName)){
    				userName = cookies[i].getValue();
    				//System.out.println(userName);
    			}
    			if(cookies[i].getName().equals(cookiePwd)){
    				pwd = cookies[i].getValue();
    				//System.out.println(pwd);
    			}
    		}
    	}
    	response.setContentType("text/html; charset = GBK");
    	PrintWriter out = response.getWriter();
    	out.println("<html>\n");
    	out.println("<head><title>Login</title></head>\n");
    	out.println("<body><center>\n");
    	out.println("<form action='CookieTest'"+" method='POST'>\n");
    	out.println("Name:<input type='text' name='Username' value='"+userName+"'><br/>\n");
    	out.println("Pass:<input type='password' name='Pwd' value='"+pwd+"'><br/>\n");
    	out.println("Keep Status<input type='checkbox' name='saveCookie' value='Yes'>\n");
    	out.println("<br/>\n");
    	out.println("<input type='submit'>\n");
    	out.println("</form></center></body>\n");
    	out.println("</html>\n");
    }
    public void doPost(HttpServletRequest request,HttpServletResponse response)
     throws ServletException,IOException{
    	doGet(request,response);
    }
}
上面的Servlet作为前端使用,首先获取了Cookies数组,如果有则把对应的数据写入到相应的框框中,如果没有(也就是null)则不写入。运行这个Servlet后前端将获得页面。

(2)真正的Controller

package servlet;

import java.io.IOException;
import java.io.PrintWriter;

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 CookieTest extends HttpServlet{
   public void doGet(HttpServletRequest request,HttpServletResponse response)
     throws ServletException,IOException
   {
	   Cookie userCookie = new Cookie("userName",request.getParameter("Username"));
	   Cookie pwdCookie = new Cookie("pwd",request.getParameter("Pwd"));
	   if(request.getParameter("saveCookie") != null
			   && request.getParameter("saveCookie").equals("Yes")
			   ){
		   userCookie.setMaxAge(7 * 24 * 60 * 60);
		   pwdCookie.setMaxAge(7 * 24 * 60 * 60);
	   }else{
		   userCookie.setMaxAge(0);
		   pwdCookie.setMaxAge(0);
	   }
	   
	   //userCookie.setMaxAge(7 * 24 * 60 * 60);
	   //pwdCookie.setMaxAge(7 * 24 * 60 * 60);
	   response.addCookie(userCookie);
	   response.addCookie(pwdCookie);
	   response.setContentType("text/html");
	   PrintWriter out = response.getWriter();
	   out.println("Welcome," + request.getParameter("Username"));
   }
   public void doPost(HttpServletRequest request,HttpServletResponse response)
		     throws ServletException,IOException{
		    	doGet(request,response);
		    } 
}
每一次用户进入登陆页面的时候都有可能会更改用户名和密码,所以Cookie的实时更新是很重要的。


3、实验过程中出现的错误

1)userName和UserName和Username混淆

2)web.xml的格式应该为:

<servlet-mapping>
    <servlet-name>CookieTest</servlet-name>
    <url-pattern>/CookieTest</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>Hello</servlet-name>
    <url-pattern>/hello</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>LoginServlet</servlet-name>
    <url-pattern>/LoginServlet</url-pattern>
  </servlet-mapping>

注意<servlet-mapping></servlet-mapping>内只有一个Servlet及其对应url不然运行会出错,但是不报错。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值