借用百度百科上的说法,Cookie(有时也用其复数形式Cookies),是指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密)。
因为HTTP协议的无连接性,所以要求出现一种保存C/S间状态的机制,而Cookie就是符合这种要求保存在客户端的文本文件,Cookie是以“名-值”的形式保存数据。
Cookie可用于同一用户的不同页面共享数据,保存用户的用户名、密码在一定时间内不用重新登录和记录用来访问网站的喜好等等。
下面就通过一个例子来更好的理解Cookie,先一个页面设置Cookie,然后在另一个页面读取到COokie并显示。
设置Cookie代码:
/**
* @(#)TestCookie.java
*
*测试servlet中Cookie的用法
* @author
* @version 1.00 2017/2/26
*/
package com.chongqing;
import javax.servlet.http.*;
import java.io.*;
import javax.servlet.ServletException;
public class TestCookie extends HttpServlet {
//处理get请求
public void doGet(HttpServletRequest req,HttpServletResponse res) throws ServletException, IOException{
//向客户端写入Cookie,共6个
for(int i = 0; i < 3; ++i)
{
//3个没有设置时间的cookie,属于本窗口及其子窗口
Cookie cookie = new Cookie("Session-Cookie-"+i, "Cookie-value-p"+i);
res.addCookie(cookie);
//三个cookie设置了时间(单位是秒),属于文本,别的窗口也可以访问到这些cookie
cookie = new Cookie("Persisten-Cookie-"+i, "Cookie-Vslue-P"+i);
cookie.setMaxAge(60*60*1); //1小时
res.addCookie(cookie);
}
//显示跳转到ShowCookie的页面
res.setContentType("text/html;charset=gb2312");
PrintWriter out = res.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>设置Cookie页面</title>");
out.println("</head>");
out.println("<body>");
out.println("设置Cookie成功!<br/>");
out.println("<a href=showcookie>显示设置的Cookie</a>");
out.println("</body>");
out.println("</html>");
}
public void doPost(HttpServletRequest req,HttpServletResponse res) throws ServletException, IOException{
this.doGet(req,res);
}
}
/**
* @(#)ShowCookie.java
*
*测试servlet中Cookie的用法
* @author
* @version 1.00 2017/2/26
*/
package com.chongqing;
import javax.servlet.http.*;
import java.io.*;
import javax.servlet.ServletException;
public class ShowCookie extends HttpServlet {
//处理get请求
public void doGet(HttpServletRequest req,HttpServletResponse res) throws ServletException, IOException{
res.setContentType("text/html;charset=gb2312");
PrintWriter out = res.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>读取Cookie页面</title>");
out.println("</head>");
out.println("<body>");
out.println("<table border=1 align=center>");
out.println("<TH>Cookie Name<TH>Cookie Value<br>");
// 读取客户端的所有Cookie
Cookie[] cookies = req.getCookies();
if(null != cookies)
{
Cookie cookie;
for(int i = 0; i < cookies.length; i++)
{
cookie = cookies[i];
out.println("<tr>" + "<td>" + cookie.getName() +"</td>"
+ "<td>" + cookie.getValue() +"</td></tr>");
}
}
out.println("</table>");
out.println("</body>");
out.println("</html>");
}
public void doPost(HttpServletRequest req,HttpServletResponse res) throws ServletException, IOException{
this.doGet(req,res);
}
}
结果:
Cookie需要注意的问题:
1、服务器向客户端写入的内容只能是文本内容
2、客户端可以阻止服务器的写入。
3、用户只能读取自己webapp写入的东西。
4、通过setMaxAge可以设置Cookie的保存时间,如果没有设置,则Cookie保存在内存中,关掉窗口Cookie就会消失。
5、一个Servlet/JSP设置的cookie能够被同一个路径或其子路径的Servlet/JSP读取到,但不能被其父路径读取,这里的路径是指URL路径。
比如说如果这样部署web.xml文件,则showCookie不能读取到testCookie设置的Cookie:
<servlet>
<servlet-name>testcookie</servlet-name>
<servlet-class>com.chongqing.TestCookie</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>testcookie</servlet-name>
<url-pattern>/test/testcookie</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>showcookie</servlet-name>
<servlet-class>com.chongqing.ShowCookie</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>showcookie</servlet-name>
<url-pattern>/showcookie</url-pattern>
</servlet-mapping>
最后,是将Cookie应用在用户管理系统中,实现两个星期不用重复登录的功能
登录界面代码:
/**
* @(#)HelloGen.java
*
*登录界面
* @author
* @version 1.00 2017/2/23
*/
package com.chongqing;
import javax.servlet.http.*;
import java.io.*;
public class Login extends HttpServlet {
//处理get请求
public void doGet(HttpServletRequest req,HttpServletResponse res){
//业务逻辑
try {
//中文乱码
res.setContentType("text/html;charset=gbk");
PrintWriter pw = res.getWriter();
//返回登录界面
pw.println("<html>");
pw.println("<body>");
String info = req.getParameter("info");
if(null != info)
{
pw.println("<h1>用户名或者密码错误!</h1><br/>");
}
pw.println("<h1>登录界面</h1>");
pw.println("<form action= logincl method=post>");
pw.println("用户名:<input type=text name=username><br>");
pw.println("密码:<input type=password name=passwd><br>");
pw.println("<input type=checkbox name=keep value=2>两周内不重复登录<br> ");
pw.println("<input type=submit value=login><br>");
pw.println("</form>");
pw.println("</body>");
pw.println("</html>");
}
catch (Exception ex) {
ex.printStackTrace();
}
}
public void doPost(HttpServletRequest req,HttpServletResponse res){
this.doGet(req,res);
}
}
登录验证代码:
package com.chongqing;
import javax.servlet.http.*;
import java.io.*;
import java.sql.*;
public class LoginCl extends HttpServlet {
//处理get请求
public void doGet(HttpServletRequest req,HttpServletResponse res){
Connection ct = null;
PreparedStatement ps = null;
ResultSet rs = null;
//业务逻辑
try {
//接收用户名和密码
String u = req.getParameter("username");
String p = req.getParameter("passwd");
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
ct = DriverManager.getConnection("jdbc:sqlserver://127.0.0.1:1433;DatabaseName=TestServlet","sa","123456");
ps = ct.prepareStatement("select * from users where username = ? and passwd = ?");
ps.setString(1,u);
ps.setString(2,p);
rs = ps.executeQuery();
if(rs.next()){
//合法用户
String keep = req.getParameter("keep");
if(null != keep){
//将用户名和密码通过Cookie保存到客户端
//创建Cookie
Cookie name = new Cookie("myname",u);
Cookie passwd = new Cookie("passwd",p);
//设置时间,保存两周
name.setMaxAge(2*7*24*3600);
passwd.setMaxAge(2*7*24*3600);
//回写到客户端
res.addCookie(name);
res.addCookie(passwd);
}
//添加Session并跳转到欢迎界面
HttpSession mySession = req.getSession(true);
mySession.setMaxInactiveInterval(60*10); //指定Session存活的时间,单位是秒
mySession.setAttribute("usname",u); //在Session中添加一个属性
res.sendRedirect("wel");//转到wel界面
}else{
//不合法
res.sendRedirect("login");//返回login界面
}
/*
//验证
if(u.equals("zero")&&p.equals("123")){
//合法,添加Session并跳转到欢迎界面
HttpSession mySession = req.getSession(true);
mySession.setMaxInactiveInterval(30); //指定Session存活的时间,单位是秒
mySession.setAttribute("usname",u); //在Session中添加一个属性
res.sendRedirect("wel");//写你要到的Servlet的URL
}else{
//不合法
res.sendRedirect("login");//写你要到的Servlet的URL
}
*/
}
catch (Exception ex) {
ex.printStackTrace();
}finally{
//关闭资源!!!
//关闭顺序是,谁后创建谁先关闭
try {
if(null != rs){
rs.close();
}
if(null != ps){
ps.close();
}
if(null != ct){
ct.close();
}
} catch (SQLException e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
public void doPost(HttpServletRequest req,HttpServletResponse res){
this.doGet(req,res);
}
}
欢迎界面代码:
package com.chongqing;
import javax.servlet.http.*;
import java.io.*;
import java.sql.*;
public class wel extends HttpServlet {
//处理get请求
public void doGet(HttpServletRequest req,HttpServletResponse res){
Connection ct = null;
PreparedStatement ps = null;
ResultSet rs = null;
//首先判断Session中是否有登录时添加的属性
HttpSession mySession = req.getSession(true);
String val = (String)mySession.getAttribute("usname");
try {
if(null == val){
//如果session中没有用户信息,再看看Cookie中有没有
String name = null;
String passwd = null;
//从客户端获得所有Cookie
Cookie[] allCookies = req.getCookies();
if(null != allCookies){
for(int i=0; i < allCookies.length; ++i){
//依次取出Cookie
Cookie myCookie = allCookies[i];
if(myCookie.getName().equals("myname")){
//得到Cookie的值
name = myCookie.getValue();
}else if(myCookie.getName().equals("passwd")){
passwd = myCookie.getValue();
}
}
//如果用户名和密码都不为空
if(!name.equals("")&&!passwd.equals("")){
//到loginCl中进行验证是否用户名和密码合法
res.sendRedirect("logincl?username="+name+"&passwd="+passwd);
return;
}
}
//返回登录界面
res.sendRedirect("login?info=error");
return;
}
//中文乱码
res.setContentType("text/html;charset=gbk");
PrintWriter pw = res.getWriter();
//把所有内容放在中间
pw.println("<body><center>");
pw.println("Welcom!");
//分页的功能
int pageSize = 3; //每页显示3条记录
int pageNow = 1; //首先显示第一页的内容
int pageCount = 0; //一共有多少页(通过计算获得)
int rowCount = 0; //一共有多少行记录(通过查表获得)
//动态的接收pageNow
String sPageNow = req.getParameter("pageNow");
if(null != sPageNow){
pageNow = Integer.parseInt(sPageNow);
}
//连接数据库
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
ct = DriverManager.getConnection("jdbc:sqlserver://127.0.0.1:1433;DatabaseName=TestServlet","sa","123456");
ps = ct.prepareStatement("select count(*) from users");
rs = ps.executeQuery();
if(rs.next()){
rowCount = rs.getInt(1);//获得rowCount的值
}
//计算pageCount的值
if(rowCount%pageSize == 0){
pageCount = rowCount/pageSize;
}else{
pageCount = rowCount/pageSize + 1;
}
ps = ct.prepareStatement("select top "+pageSize+" * from users where userID not in (select top "+pageSize*(pageNow-1)+" userID from users)");
//ps.setInt(1,pageSize); //不能采用对问号赋值的方式
//ps.setInt(2,pageSize*(pageNow-1));
rs = ps.executeQuery();
//用表格显示用户的信息
pw.println("<table border = 1>");
pw.println("<tr><td>userID</td><td>username</td><td>passwd</td><td>email</td><td>grade</td></tr>");
while(rs.next()){
pw.println("<tr>");
pw.println("<td>"+rs.getInt(1)+"</td>");
pw.println("<td>"+rs.getString(2)+"</td>");
pw.println("<td>"+rs.getString(3)+"</td>");
pw.println("<td>"+rs.getString(4)+"</td>");
pw.println("<td>"+rs.getInt(5)+"</td>");
pw.println("</tr>");
}
pw.println("</table>");
//显示超链接
if(1 != pageNow){
pw.println("<a href=wel?pageNow="+1+">首页</a>");
}
for(int i=1; i<=pageCount; ++i ){
pw.println("<a href=wel?pageNow="+i+">"+i+"</a>");
}
if(pageCount != pageNow){
pw.println("<a href=wel?pageNow="+pageCount+">尾页</a>");
}
pw.println("</body></center>");
}
catch (Exception ex) {
ex.printStackTrace();
}finally{
//关闭资源!!!
//关闭顺序是,谁后创建谁先关闭
try {
if(null != rs){
rs.close();
}
if(null != ps){
ps.close();
}
if(null != ct){
ct.close();
}
} catch (SQLException e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
public void doPost(HttpServletRequest req,HttpServletResponse res){
this.doGet(req,res);
}
}
运行结果: