• JavaWeb -- 会话, Cookie 和 Session


    1. 会话
    Cookie客户端技术,服务器把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。
    Session服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。
     
    2. API
    javax.servlet.http.Cookie类用于创建一个Cookieresponse接口也中定义了一个addCookie方法,它用于在其响应头中增加一个相应的Set-Cookie头字段。同样,request接口中也定义了一个getCookies方法,它用于获取客户端提交的CookieCookie类的方法:
    public Cookie(String name,String value) setValuegetValue方法 setMaxAgegetMaxAge方法 setPathgetPath方法setDomaingetDomain方法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浏览器一般只允许存放300Cookie,每个站点最多存放20Cookie,每个Cookie的大小限制为4KB
    l如果创建了一个cookie,并将他发送到浏览器,默认情况下它是一个会话级别的cookie(即存储在浏览器的内存中),用户退出浏览器之后即被删除。若希望浏览器将该cookie存储在磁盘上,则需要使用maxAge,并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该cookie
    l注意,删除cookie时,path必须一致,否则不会删除
     
    4.Session
    Session生命周期: 第一次请求request.getSession()时创建, 创建后如果30分钟内没有使用,服务器就将其销毁:
    lWEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。
    SessionCookie的主要区别在于:
    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);
    	}
    
    }
    





     

     
     
     
     
  • 相关阅读:
    单片机开发 郭天祥
    OpenNI检测不到Kinect Camera和Kinect Audio了
    python中的类的成员变量以及property函数
    python lambda
    python中的括号以及元组和列表的区别
    python的self
    python exception的传递
    python的闭包
    函数里面定义函数
    在yum出问题的情况下安装某个rpm包的方法
  • 原文地址:https://www.cnblogs.com/xj626852095/p/3648156.html
Copyright © 2020-2023  润新知