• servlet(5)


    1、会话概述

    (1)会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。

    (2)会话过程中的数据不宜保存在request和servletContex中,所以一般中cookie保存

    (3)保存会话数据的两种技术

    ==> Cookie:Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器

    ==> HttpSession:Session是服务器端技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的HttpSession对象

    2、Cookie API

    javax.servlet.http.Cookie类用于创建一个Cookie,response接口中定义了一个addCookie方法,它用于在其响应头中增加一个相应的Set-Cookie头字段。同样,request接口中也定义了一个getCookies方法,它用于获取客户端提交的Cookie。

    Cookie类的方法:

    ==> new Cookie(String name,String value) 新建一个cookie

    ==> cookie.getName() 获取此Cookie对象的name

    ==> cookie.getValue()与cookie.setValue() 获取和设置此Cookie对象的value

    ==> cookie.setMaxAge()与cookie.getMaxAge() 设置此cookie的有效时间(单位是秒)

    ==> cookie.setPath()与cookie.getPath()

    ==> cookie.setDomain()与cookie.getDomain()

    3、Cookie的属性

    (1)name:必须的

    (2)value:必须的

    (3)comment:可选的。注释

    (4)path:可选的

    写Cookie的程序的访问路径是:http://localhost:8080/testServlet/cookie/cookieDemo(其中:localhost就是域名;/testServlet/cookie就是当前Cookie的path)。访问的地址的URI.startWith(cookie的路径)为true,客户端的数据会传给服务器

    ==》比如浏览器存的cookie的路径是/testServlet

    现在访问的地址是:http://localhost:8080/testServlet/cookie/cookieDemo 客户端的数据会传给服务器

    现在访问的地址是:http://localhost:8080/testServlet/cookieDemo 会

    如果一个Cookie的路径设置成了/testServlet,意味着当前应用下的所有资源浏览器都会传给给服务器

    ==》比如浏览器存的cookie的路径是/testServlet/cookie

    现在访问的地址是:http://localhost:8080/testServlet/cookie/cookieDemo 会

    现在访问的地址是:http://localhost:8080/testServlet/cookieDemo 不会

    (5)domain:可选的。该Cookie所属的网站域名(localhost)默认值。

    (6)maximum age:可选的。单位是秒。不设置就是会话过程(存在浏览器的内存中)。如果是0,说明要删除。

    (7)version:可选的

    (8)区分Cookie:domain + path + name 来区分的

    4、Cookie的增加、读取、删除

    (1)增加:HttpServletResponse.addCookie(name,value)

    一个浏览器针对一个网站最多存20个Cookie;最多存300个Cookie,每个Cookie的长度不能超过4KB

    一个WEB站点可以给一个WEB浏览器发送多个Cookie,一个WEB浏览器也可以存储多个WEB站点提供的Cookie

    (2)读取:HttpServletRequest.getCookies() 只能从客户端得到key和value的值

    (3)删除:cookie.setMaxAge(0);

    如果创建了一个cookie,并将他发送到浏览器,默认情况下它是一个会话级别的cookie(即存储在浏览器的内存中),用户退出浏览器之后即被删除。若希望浏览器将该cookie存储在磁盘上,则需要使用maxAge,并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该cookie。

    删除cookie时,path必须一致,否则不会删除

    (4)示例

    		==>增加cookie
    		PrintWriter out = resp.getWriter();	
    		out.println("写入Cookie测试");
    
    		Cookie cookie = new Cookie("username", "smalle"); //创建一个Cookie实例
    		cookie.setMaxAge(60); //单位是秒,设置有效时间为1分钟。最大可以设置Integer.MAX_VALUE
    		resp.addCookie(cookie); // 往响应流中写入Cookie
    	
    		out.println("如果不清除cookie,即使关闭了浏览器,只要在60内访问任可以访问到");
    		---------------------------------------------------------------------------------
    		==>读取cookie
    		PrintWriter out = resp.getWriter();	
    		out.println("读取Cookie测试");
    		
    		Cookie[] cookies =  req.getCookies(); //获取请求Cookie数组
    		if(cookies != null) {
    			for(Cookie cookie : cookies) { //遍历cookie信息
    				out.println("Cookie名: " + cookie.getName());
    				out.println("Cookie值: " + cookie.getValue());
    				out.println("从客户端只能获取key和value,利用getMaxAge()等方法是获取不到相应的信息的");	
    			}		
    		}else {
    			out.println("您还没有Cookie值");
    		}
    		----------------------------------------------------------------------------------
    		==>清除cookie
    		Cookie cookie = new Cookie("username", null);
    		cookie.setMaxAge(0);
    		//cookie.setPath("/");
    		resp.addCookie(cookie);
    		/**
    		 * 如果需要注销所有的cookie
    		 * Cookie[] cookies = request.getCookies();
    		 * for (Cookie cookie : cookies) {
    		 * 	cookie2.setMaxAge(0);
    		 * 	//cookie.setPath("/");
    		 * 	response.addCookie(cookie);
    		 * }
    		 */
    	

    5、Session介绍

    (1)在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象)。注意:默认情况下,一个浏览器独占一个session对象。服务器就把数据保存在这个session对象中,当退出浏览器时,保存的数据就会丢失。

    (2)Session和Cookie的主要区别在于:

    ==》Cookie是把用户的数据写给用户的浏览器。

    ==》Session技术把用户的数据写到用户独占的session中。Session对象由服务器创建,开发人员可以调用request对象的getSession方法得到session对象。

    (3)Session就相当于特殊的Cookie,Cookie中的JSESSIONID就是此session的ID。可用session.getId()验证

    6、创建HttpSession

    (1)public HttpSession getSession()。调用此方法时,容器会先检查客户端先前发送出的请求是否创建过Http会话。如果没有,容器就会新建一个会话,并赋予一个唯一的会话ID。如果有,容器会根据客户请求中的会话ID找到匹配的会话返回。

    (2)public HttpSession getSession(boolean flag)。此方法的flag参数是用来置顶是否有必须要创建一个新的会话。调用getSession(false)时,若客户先前没有建立过会话。则方法将返回null。如果flag为true则同第一种

    (3)HttpSession的常用操作:

    ==> public boolean isNew():判断当前会话对象是不是一个新创建的会话。

    ==> public Object getAttribute(String name); 根据置顶名从会话中取出某个属性对应的值。

    ==> public void setAttribute(String key,Object value); 设置指定名称将某个对象存放在会话中。

    ==> public void removeAttribute(String key); 根据key删除会中中的对象。

    ==> public long getCreationTime():返回session创建的时间的毫秒值。

    ==> public String getId(); 获取会话的SessionId;

    ==> public long getLastAccessdTime(); 得到最好一次访问次会话的时间毫秒值。

    ==> public long getMaxInactiveInterval(); 得到会话超时的时间秒值。

    ==> public void setMaxInactiveInterval(int interval); 设置会话超时的时间秒值。

    ==> public void invalidate(); 让所有会话失效。

    (4)示例

    		==>设置session
    		//访问的话,直接在浏览器中输入 http://127.0.0.1:8080/testServlet/setSession?name=smalle
    		String name = req.getParameter("name");
    		HttpSession session = req.getSession(); //获取HttpSession对象
    		session.setAttribute("name", name); //写入session,实际上时写在内存中了,在cookie保存相应的ID
    		/** 跳转到getSession查看保存的值。
    		 *  此处的href必须为/testServlet/getSession或者为getSession才hi跳转到http://127.0.0.1:8080/testServlet/getSession
    		 *  带/表示绝对路径,不带/表示相对路径(相对于根目录 http://127.0.0.1:8080/项目名)
    		 */	
    		resp.getWriter().write("<a href='getSession'>click view</a>");
    		-------------------------------------------------------------------------------------
    		==>得到session
    		HttpSession session = req.getSession(); //获取HttpSession对象
    		String name = (String)session.getAttribute("name");
    		resp.getWriter().write("保存的值为===" + name);
    		//这两个
    都能显示换行
    		resp.getWriter().write('
    '+ "
    ID为===" + session.getId() + "===他就是Cookie下的JSESSIONID的值"); //这句是验证5、Session介绍中的第(3)条
    		----------------------------------------------
    		==>web.xml中的代码省略
    	

    7、更改内存中HttpSession对象的超时时间(注意单位是分钟)

    修改工程的web.xml

    		<session-config>
    			<session-timeout>30</session-timeout> <!--自然整数,单位是分钟,即保存30分钟-->
    		</session-config>
    	





  • 相关阅读:
    洛谷P1357 Solution
    洛谷P3469 Solution
    洛谷P2617 Solution
    CF818F Solution
    CF802K Solution
    CF519E Solution
    在代码中改变log的级别
    Java非对称加密解密
    mvn test 远程调试
    rsyn实现服务器源码同步
  • 原文地址:https://www.cnblogs.com/oldinaction/p/5167479.html
Copyright © 2020-2023  润新知