简单点来说:
cookie和session都是用来跟踪浏览器用户身份的会话方式
cookie数据保存在客户端,session数据保存在服务器端。
session是放在服务器上的,过期与否取决于服务期的设定,cookie是存在客户端的,过去与否可以在cookie生成的时候设置进去。
软件包: javax.servlet
在线API文档
http://tomcat.apache.org/tomcat-5.5-doc/servletapi/
所包含的接口:
RequestDispatcher;Servlet;ServletConfig;ServletContext;ServletRequest;ServletResponse;SingleThreadModel。 所包含的类:
GenericServlet;ServletInputStream;ServletOutputStream;ServletException;UnavailableException。
Cookie类
构造方法
Cookie(java.lang.String name, java.lang.String value) 构造具有指定名称和值的cookie。常用方法
String getName() //返回一个cookie的名称String getValue() //返回一个cookie的值void setPath(java.lang.String uri) //指定要返回的cookie路径。setValue(java.lang.String newValue) //给创建后的cookie赋予一个新的值getComment()//返回描述cookie的目的的注释,如果cookie没有注释,则返回null。参数:
name-指定cookie名称的字符串value -指定cookie值的字符串//创建一个Cookie对象Cookie cookie = new Cookie("username","lingdu");//给cookie设置一些属性cookie.setPath("/admin");cookie.setComment("lingdu");cookie.setValue("lingdu");//最后将cookie添加进来response.addCookie(cookie);
Session
HttpSession接口
HttpSession类似于哈希表的接口,它提供了setAttribute ()和getAttribute()方法存储和检索对象。HttpSession提供了一个会话ID关键字,一个参与会话行为的客户端在同一会话的请求中存储和返回它。servlet引擎查找适当的会话对象,并使之对当前请求可用。
定义
public interface HttpSession这个接口被Servlet引擎用来实现在HTTP客户端和HTTP会话两者的关联。这种关联可能在多外连接和请求中持续一段给定的时间。session用来在无状态的HTTP协议下越过多个请求页面来维持状态和识别用户。一个session可以通过cookie或重写URL来维持。方法
public long getCreationTime();//返回建立session的时间,这个时间表示为自1970-1-1日(GMT)以来的毫秒数。void setAttribute(String name,Object value) //使用指定的名称将对象绑定到该会话。Object getAttribute(String name) //将会话中一个对象保存为指定名字,返回或删除前面保存的此名称对象。public String getId();//返回分配给这个session的标识符。一个HTTPsession的标识符是一个由服务器来建立和维持的唯一的字符串。public long getLastaccessedTime();//返回客户端最后一次发出与这个session有关的请求的时间,如果这个session是新建立的,返回-1。这个时间表示为自1970-1-1日(GMT)以来的毫秒数。public int getMaxInactiveInterval();//返加一个秒数,这个秒数表示客户端在不发出请求时,session被Servlet引擎维持的最长时间。在这个时间之后,Servlet引擎可能被Servlet引擎终止。如果这个session不会被终止,这个方法返回-1。//当session无效后再调用这个方法会抛出一个IllegalStateException。public void invalidate();//这个方法会终止这个session。所有绑定在这个session上的数据都会被清除。并通过HttpSessionBindingListener接口的valueUnbound方法发出通告。public Boolean isNew();//返回一个布尔值以判断这个session是不是新的。如果一个session已经被服务器建立但是还没有收到相应的客户端的请求,这个session将被认为是新的。这意味着,这个客户端还没有加入会话或没有被会话公认。在他发出下一个请求时还不能返回适当的session认证信息。//当session无效后再调用这个方法会抛出一个IllegalStateException。public int setMaxInactiveInterval(intinterval);//设置一个秒数,这个秒数表示客户端在不发出请求时,session被Servlet引擎维持的最长时间。实例
//拿到请求的session对象HttpSession session = request.getSession();//获取session请求的username的值String sessionUsername = (String) session.getAttribute("username");
避免重复登录的方法
实现原理:
利用session机制,当用户登录成功之后,给用户设置一个session值,当用户再次访问的时候可以跳过登录。
客户端每次请求服务器的时候会发送当前会话的sessionid,服务器根据当前sessionid判断相应的用户数据标志,以确定用户是否登录或具有某种权限。
登录页面login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body> <form action="LoginAction" method="post"> <input type="text" name="username"> <br> <input type="passWord" name="password"> <br> <input type="submit" value="提交"><br> </form></body></html>
登录成功之后的页面 vip.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><% if (session.getAttribute("username") == null) { //request.getRequestDispatcher("../login.jsp").forward(request, response); response.sendRedirect("../login.jsp"); return; } if (!((String) session.getAttribute("username")).equals("lingdu")) { //request.getRequestDispatcher("../login.jsp").forward(request, response); response.sendRedirect("../login.jsp"); }%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body> 欢迎vip《zongxing》您可以享受以下服务 <a href="#">高级大床房</a> <a href="#">5星级自助餐</a></body></html>
Servlet 代码 LoginAction.java
import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;/** * Servlet implementation class LoginAction */@WebServlet("/LoginAction")public class LoginAction extends HttpServlet { PRivate static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public LoginAction() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取请求的用户名 String username = request.getParameter("username"); //获取请求的密码 String password = request.getParameter("password"); System.out.println(username + "," + password); //拿到请求的session对象 HttpSession session = request.getSession(); //获取session请求的username的值 String sessionUsername = (String) session.getAttribute("username"); //如果值不为空 && 值=lingdu if(sessionUsername != null && sessionUsername.equals("lingdu")){ //请求转发到vip.jsp页面 request.getRequestDispatcher("admin/vip.jsp").forward(request, response); return; } //只允许某些人登录 //如果传过来的用户名跟密码跟这个一致 if(username.equals("lingdu") && password.equals("123456")){ //将用户名设置到session session.setAttribute("username", username); //登录成功也跳转 request.getRequestDispatcher("admin/vip.jsp").forward(request, response); return; } //如果所有条件都不满足,则重新登录 request.getRequestDispatcher("login.jsp").forward(request, response); }}因为sessionid是服务器分配的,所以下次再访问的时候就不需要用户名密码了。
