JavaWeb -- 会话, Cookie 和 Session
1. 会话
•Cookie是客户端技术,服务器把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。
•Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。
2. API
javax.servlet.http.Cookie类用于创建一个Cookie,response接口也中定义了一个addCookie方法,它用于在其响应头中增加一个相应的Set-Cookie头字段。同样,request接口中也定义了一个getCookies方法,它用于获取客户端提交的Cookie。Cookie类的方法:
public Cookie(String name,String value) setValue与getValue方法 setMaxAge与getMaxAge方法 setPath与getPath方法setDomain与getDomain方法getName方法
3. 实例:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub response.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); out.print("上次访问时间: "); //get Cookie 获得上次写入的cookie Cookie[] cookies = request.getCookies(); //从request获得cookie数组 for(int i=0; cookies!=null && i<cookies.length; i++) { if( cookies[i].getName().equals("lastAccessTime") ) { long cookieValue = Long.parseLong(cookies[i].getValue()); Date date = new Date(cookieValue); out.print(date.toLocaleString()); } } //write cookie 写入相应名字的cookie Cookie cookie = new Cookie("lastAccessTime", System.currentTimeMillis()+""); //新建访问时间cookie cookie.setMaxAge(1*30*24*3600); cookie.setPath("/WebTest3"); response.addCookie(cookie); //将cookie添加到response,将会返回到浏览器 }
cookie的一些细节
l一个Cookie只能标识一种信息,它至少含有一个标识该信息的名称(NAME)和设置值(VALUE)。
l一个WEB站点可以给一个WEB浏览器发送多个Cookie,一个WEB浏览器也可以存储多个WEB站点提供的Cookie。
l浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。
l如果创建了一个cookie,并将他发送到浏览器,默认情况下它是一个会话级别的cookie(即存储在浏览器的内存中),用户退出浏览器之后即被删除。若希望浏览器将该cookie存储在磁盘上,则需要使用maxAge,并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该cookie。
l注意,删除cookie时,path必须一致,否则不会删除
4.Session
Session生命周期: 第一次请求request.getSession()时创建, 创建后如果30分钟内没有使用,服务器就将其销毁:
l在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。
Session和Cookie的主要区别在于:
•Cookie是把用户的数据写给用户的浏览器。
•Session技术把用户的数据写到用户独占的session中。
Session对象由服务器创建,开发人员可以调用request对象的getSession方法得到session对象。
Web.xml中配置Session生命周期:
<!-- 10 minutes 10分钟--> <session-config> <session-timeout>10</session-timeout> </session-config>
实例:
Servlet Demo4 写入Session
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub response.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); HttpSession session = request.getSession(); //获得Session String sessionID = session.getId(); Cookie cookie = new Cookie("JSESSIONID", sessionID); cookie.setPath("/WebTest3"); cookie.setMaxAge(30*60); //设置保存时间,不然关闭浏览器即销毁相应的Cookie response.addCookie(cookie); session.setAttribute("name", "bug a TV"); out.print("bug"); //String url1 = response.encodeURL("/WebTest2/Demo4"); //如果浏览器的Cookie功能被关闭,则需要重写URL //String url2 = response.encodeURL("/WebTest2/Demo5"); }
Servlet Demo5 读出Session
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub response.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); HttpSession session = request.getSession(false); if(session!=null) { String product = (String) session.getAttribute("name"); out.print("name = " + product); } }
实现自动登录功能:
首页JSP代码: welcome.jsp
<body> Welcome: ${user.username} <br/> <a href="/WebTest3/1.html">Login</a> <br/> <a href="/WebTest3/Demo7">Logout</a> <br/> </body>
注册表单 1.html
<form action="/WebTest3/Demo6" method="post"> 用户名:<input type="text" name="username"/> <br/> 密码: <input type="password" name="passwd"/><br/> 登录: <input type="submit" name="submit"/> <br/> 自动登录:<input type="checkbox" name="autoLogin" value="true"/> <br/> </form>
登录处理,建立Session Demo6.java
@WebServlet("/Demo6") public class Demo6 extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public Demo6() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub response.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); String username = request.getParameter("username"); String passwd = request.getParameter("passwd"); //System.out.println("log: " + username + " " + passwd); ArrayList<User> list = DB.getAll(); //从数据库获取用户信息 for(User user : list) { if(user.getUsername().equals(username) && user.getPasswd().equals(passwd)) //用户名密码校验 { request.getSession().setAttribute("user", user); response.sendRedirect("/WebTest3/welcome.jsp"); //获得Session return; } } out.write("Username or passwd Error"); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub this.doGet(request, response); } } class DB { private static ArrayList list; static { list = new ArrayList<User>(); list.add(new User("kevin", "123456")); list.add(new User("xiang", "123456")); } public DB() { super(); // TODO Auto-generated constructor stub } public static ArrayList getAll() { return list; } }
登录用户User类
public class User implements Serializable { private String username; private String passwd; public User() { super(); // TODO Auto-generated constructor stub } public User(String username, String passwd) { super(); this.username = username; this.passwd = passwd; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPasswd() { return passwd; } public void setPasswd(String passwd) { this.passwd = passwd; } }登录注销Servlet Demo7
public class Demo7 extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public Demo7() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub HttpSession session = request.getSession(); if( session==null) { response.sendRedirect("/WebTest3/welcome.jsp"); return; } session.removeAttribute("user"); //删除Session中的User 注销 response.sendRedirect("/WebTest3/welcome.jsp"); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub this.doGet(request, response); } }