Session 跟 Cookie

2/22/2017来源:ASP.NET技巧人气:1064

简单点来说:

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);

1


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是服务器分配的,所以下次再访问的时候就不需要用户名密码了。

2