zoukankan      html  css  js  c++  java
  • JAVA框架-Servlet下

    session和cookie

    作用:存储客户端的状态
    由一个问题引出今天的内容,例如网站的购物系统,用户将购买的商品信息存储到哪里?因为Http协议是无状态的,
    也就是说每个客户访问服务器端资源时,服务器并不知道该客户端是谁,所以需要会话技术识别客户端的状态。会话技术是帮助服务器 记住客户端状态(区分客户端)

    会话技术

    从打开一个浏览器访问某个站点,到关闭这个浏览器的整个过程,成为一次会话。会话技术就是记录这次会话中客户端的状态与数据的。
    会话技术分为Cookie和Session:

    • Cookie:数据存储在客户端本地,减少服务器端的存储的压力,安全性不好,客户端 可以清除cookie
    • Session:将数据存储到服务器端,安全性相对好,增加服务器的压力

    cookie技术

    • 服务器向客户端发送一个cookie
      1. 创建cookie 使用new关键字就可以创建
      2. 设置cookie持久化时间
      3. 设置cookie携带路径
      4. 向客户端发送cookie
      5. 删除cookie
    • 服务器怎么接收客户端携带的数据
    request.getCookies(); 返回 数组类型
    
    • cookie案例

      一个简单的案例,我们先写一个文件来给创建一个cookie,然后把它发送到客户端。

      package CookieDemo;
      
      import java.io.IOException;
      import javax.servlet.ServletException;
      import javax.servlet.annotation.WebServlet;
      import javax.servlet.http.Cookie;
      import javax.servlet.http.HttpServlet;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      
      /**
       * Servlet implementation class CookieDemo
       */
      @WebServlet("/CookieDemo")
      public class CookieDemo extends HttpServlet {
      	private static final long serialVersionUID = 1L;
      
      
      	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      		//服务器向客户端发送一个cookie
      		//第一步 创建cookie
      		Cookie cookie = new Cookie("name", "Tom");
      		//第二步 设置一个cookie的持久化时间
      		//如果不设置,cookie默认在浏览器内存中,浏览器关闭cookie随即销毁
      		//如果设置,存储到客户端的电脑中
      		//设置了10分钟
      		cookie.setMaxAge(10*60);
      		//第三步 设置携带路径
      		//注意事项:如果不设置携带路径,
      		//    	   那么该cookie信息访问产生该cookie的web资源的所有路径都会有cookie信息
      		System.out.println( request.getContextPath());
      		cookie.setPath( request.getContextPath() );
      		//第四步 向客户端发送这个cookie
      		response.addCookie(cookie);
      	}
      
      	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      
      	}
      
      }
      
      

      随后我们在写一个程序获得来自客户端的cookie信息:

      package CookieDemo;
      
      import java.io.IOException;
      import javax.servlet.ServletException;
      import javax.servlet.annotation.WebServlet;
      import javax.servlet.http.Cookie;
      import javax.servlet.http.HttpServlet;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      
      /**
       * Servlet implementation class GetCookeieDemo
       */
      @WebServlet("/GetCookeieDemo")
      public class GetCookeieDemo extends HttpServlet {
      	private static final long serialVersionUID = 1L;
      
      	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      		Cookie[] cookies = request.getCookies();
      		for(Cookie c:cookies ) {
      			if( c.getName().equals("name")  ) {
      				System.out.println( "对应的值:"+ c.getValue() );
      			}
      		}
      	}
      
      	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      
      	}
      
      }
      
      

      这样我们就实现了在客户端存储信息的功能(比如我们可以存储一些账户信息,因为http协议是无状态的)

    session技术

    一般结合cookie使用,用session对象在服务器中对客户端进行识别
    session对象有一个标识id标识,这个标识代表唯一的客户端id(服务器创建session对象后会把session的id ,以cookie的形式回显给客户端)

    1. 获取session对象

      request.getSession()
      
    2. session中存取数据(session也是一个域对象)范围:一次会话(比较小)

      //第一步 得到session对象
      HttpSession session = request.getSession();
      //第二步 往session对象中放置数据  所有域对象 方法名都相同 就是调用的对象名不同
      session.setAttribute("sex", "男");
      //第三步  session取数据
      String sex=(String) session.getAttribute("sex");
      System.out.println("域对象中的数据"+sex);
      //移除域对象中数据
      session.removeAttribute("sex");
      

      一个小例子:

      package CookieDemo;
      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 SessionParaDemo
       */
      @WebServlet("/SessionParaDemo")
      public class SessionParaDemo extends HttpServlet {
          private static final long serialVersionUID = 1L;
          protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              // TODO Auto-generated method stub
              HttpSession session = request.getSession();
              session.setAttribute("name", "Jeason");
              Object attribute = session.getAttribute("name");
              System.out.println( (String)attribute );
          }
          protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
          }
      
      }
      
    3. 每次回话只能生成一个session,并且其ID是唯一的,我们可以通过下面的程序看出来

      package CookieDemo;
      
      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 SessionDemo
       */
      @WebServlet("/SessionDemo")
      public class SessionDemo extends HttpServlet {
      	private static final long serialVersionUID = 1L;
      
      
      	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      		HttpSession session = request.getSession();
      		String idString = session.getId();
      		System.out.println("Session ID:"+ idString);
      		if(session.isNew()) {
      			System.out.println("this is new session!");
      		}else {
      			System.out.println("this is old session!");
      		}
      	}
      
      
      	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      	}
      }
      

      当我们在页面多次访问该程序的时候,,输出如下;

      Session ID:1CD44853C3D2B3D759A3C8F9BBBFC2CD
      this is new session!
      Session ID:1CD44853C3D2B3D759A3C8F9BBBFC2CD
      this is old session!
      Session ID:1CD44853C3D2B3D759A3C8F9BBBFC2CD
      this is old session!
      

    Session对象的生命周期

    创建:第一次执行request.getSession()时创建
    销毁:
    1)服务器(非正常)关闭时
    2)session过期/失效(默认30分钟)
    问题:时间的起算点 从何时开始计算30分钟?
    从不操作服务器端的资源开始计时
    可以在工程的web.xml中进行配置

    <session-config>
    <session-timeout>30</session-timeout>
    </session-config>
    

    3)手动销毁session
    session.invalidate();
    作用范围:默认在一次会话中,也就是说在,一次会话中任何资源公用一个session对象
    面试题:浏览器关闭,session就销毁了? 不对

    过滤器filter

    第一步 书写一个类 实现filter接口 重写里面方法
    第二步 在dofilter这个方法中根据自己需求进行 放行和不放行的设置

    下面的例子,我门假设的前提是,如果登录成功了,就把登录成功后的用户名字存到session里面,然后设置过滤器过滤主页,如果session里面没有用户的名字信息,那么不可以访问主页。

    package Project;
    
    import java.io.IOException;
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.annotation.WebFilter;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    
    /**
     * Servlet Filter implementation class FilterDemo1
     */
    @WebFilter("/index.html")
    public class FilterDemo1 implements Filter {
    
        /**
         * Default constructor. 
         */
        public FilterDemo1() {
            // TODO Auto-generated constructor stub
        }
    
    	/**
    	 * @see Filter#destroy()
    	 */
    	public void destroy() {
    		// TODO Auto-generated method stub
    	}
    
    	/**
    	 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
    	 */
    	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    		// TODO Auto-generated method stub
    	
    		HttpServletRequest httpServletRequest = (HttpServletRequest) request;
    		HttpServletResponse httpServletResponse = (HttpServletResponse)response;
    		HttpSession session = httpServletRequest.getSession();
    		String name = (String)session.getAttribute( "name" );
    		
    		
    		
    		if(name!=null) {
    			System.out.println("已验证登录状态,过滤器放行!");
    			chain.doFilter(request, response);
    			
    		}else {
    			
    			System.out.println("请登录访问");
    			httpServletResponse.sendRedirect("login.html");
    		}
    		
    		// 放行
    		
    	}
    
    	/**
    	 * @see Filter#init(FilterConfig)
    	 */
    	public void init(FilterConfig fConfig) throws ServletException {
    		// TODO Auto-generated method stub
    	}
    
    }
    
    

    监听器

    监听器就是监听某个对象的的状态变化的组件
    监听器的相关概念:
    事件源:被监听的对象 ----- 三个域对象 request session servletContext
    监听器:监听事件源对象 事件源对象的状态的变化都会触发监听器

  • 相关阅读:
    Java学习二十九天
    Java学习二十八天
    47. Permutations II 全排列可重复版本
    46. Permutations 全排列,无重复
    subset ii 子集 有重复元素
    339. Nested List Weight Sum 339.嵌套列表权重总和
    251. Flatten 2D Vector 平铺二维矩阵
    217. Contains Duplicate数组重复元素
    209. Minimum Size Subarray Sum 结果大于等于目标的最小长度数组
    438. Find All Anagrams in a String 查找字符串中的所有Anagrams
  • 原文地址:https://www.cnblogs.com/JeasonIsCoding/p/13232617.html
Copyright © 2011-2022 走看看