Cookie,Session

Cookie概念

        cookie是在浏览器访问web服务器某个资源时,由web服务器在Http响应消息头中附带传送浏览器的一小部分数据

        一但web服务器保存了某个web,那么每次访问这个服务器,都要在http请求头中吧这个cookie回传到web服务器中

        一个Cookie主要由组成它的名称(name)和值(value)组成

        创建cookie

		//创建Cookie
		Cookie ck=new Cookie("code", code);
		ck.setPath("/webs");//设置Cookie的路径
		ck.setMaxAge(-1);//内存存储,取值有三种:>0有效期,单位秒;=0浏览器关闭;<0内存存储,默认-1
		response.addCookie(ck);//添加到response对象中,响应时发送给客户端
        //注意:有效路径: 当前访问资源的上一级目录,不带主机名

获取Cookie

//获取所有的Cookie
Cookie[] cks=request.getCookies();
		//遍历Cookie
		for(Cookie ck:cks){
          //检索出自己的Cookie
			if(ck.getName().equals("code"))
			{
              //记录Cookie的值
				code=ck.getValue();
				break;
			}
		}

修改Cookie

只需要保证cookie的名和路径一致就能修改

	//修改Cookie
    Cookie ck=new Cookie("code", code);
    ck.setPath("/webs");//设置Cookie的路径
    ck.setMaxAge(-1);//内存存储,取值有三种:>0有效期,单位秒;=0失效;<0内存存储
    response.addCookie(ck);//让浏览器添加Cookie

Cookie编码与解码

        Cookie默认不支持中文,只能包含ASCII字符,所以Cookie需要对Unicode字符进行编码,否则会出现乱码

        编码可以使用java.net.URLEncoder类的endode(String str,String encoding)方法

        解码可以使用java.net.URLDecoder类的decode(String str,String encoding)方法

创建带中文的Cookie

 // 使用中文的 Cookie. name 与 value 都使用 UTF-8 编码. 
    Cookie cookie = new Cookie(
        URLEncoder.encode("姓名", "UTF-8"), 
        URLEncoder.encode("老邢", "UTF-8"));
    // 发送到客户端   
    response.addCookie(cookie);

读取带中文的Cookie

    if(request.getCookies() != null){
        for(Cookie cc : request.getCookies()){
            String cookieName = URLDecoder.decode(cc.getName(), "UTF-8");
            String cookieValue = URLDecoder.decode(cc.getValue(), "UTF-8");
            out.println(cookieName + "=");
            out.println(cookieValue + "; <br/>");
        }
    }
    else{
        out.println("Cookie 已经写入客户端. 请刷新页面. ");
    }

Cookie的优缺点

        优点:

                可以配置到期规则

                简单性:Cookie是一种基于文本的轻量架构,包含简单的键值对

                数据持久性:Cookie在默认过期时间前,是可以一直储存在客户端浏览器上的

      缺点

                大小受限制:大多数浏览器对Cookie的大小有4K,8K的字节限制

                用户配置为禁用:有些用户禁用了浏览器或客户端接收Cookie的能力,因此限制了功能

                潜在的安全风险:Cookie可能会被篡改,会对安全性造成潜在的危险或者导致依赖Cookie的程序失败

        Session对象

                        Session概述

                                Session用来记录用户的状态,Session是指单个时间内客户端与web服务器一连串相关交互的过程

                        在一个Session中客户可能多次请求访问一个资源,也有可能请求访问各种不同的服务器资源

        Session原理

                服务器会为每一次会话分配一个Session对象

                同一个浏览器发送多次请求,统一属于一次会话(Session)

                首次使用到Session是,服务器会自动创建Session并创建Cookie储存Session返回客户端

        Session使用

                Session作用域:拥有储存数据的空间,作用范围是一次会话

                        一次会话是指同一浏览器发送多次请求,一但浏览器关闭,会话结束        

                        可以将数据储存在Session中,在一次会话的任意位置进行获取

        `                可传递数据类型(基本数据类型,集合,对象,数组)

        获取Session

                Session是由服务器端自动创建,通过request对象获取

        //获取Session对象
		HttpSession session=request.getSession();
		System.out.println("Id:"+session.getId());//唯一标记,

          Session保存数据 

                setAttribute(属性名,Object)保存数据到Session中

	session.setAttribute("key",value);//以键值对形式存储在session作用域中。

     Session获取数据

        getAttribute(属性名)获取Session中的数据

	session.getAttribute("key");//通过String类型的key访问Object类型的value

        Session移除数据             

         removeAttribute(属性名)从Session中删除数据 

	session.removeAttribute("key");//通过键移除session作用域中的值

Session与Request的区别

        request是一次请求有效,请求改变,则request改变

        session是一次会话有效,浏览器改变,则session改变

Session的生命周期

        开始:第一次用到Session请求产生,就创建Session

         结束:

                浏览器关闭就失效

                Session超时就失效

                        Session.setMaxlnacterval(seconds)//设置最大有效时间(单位:秒)

                手动销毁则失效

                        session.invaldate()//登录退出,注销

        Session失效        

	session.setMaxInactiveInterval(60*60);//设置session最大有效期为一小时

	session.invalidate();//手工销毁

ServletContext对象

        概述

                全局对象,也拥有作用域,对应一个tomcat中的web应用

                在web服务器启动的时候,会为每个web应用程序创建一块共享的储存区域(ServletContext)

                ServletContext在服务器启动的时候创建,在关闭的时候销毁

获取ServletContext对象

        GenericServlet提供了getServletContext方法(推荐)this.getServeltContext()

        HttpServletRequest提供了getServletContext()方法(推荐)

        HttpSession提供了getServletContext()方法

ServletContextr作用

        获取项目真实路径

String realpath=servletContext.getRealPath("/");

        获取项目上下文路径

System.out.println(servletContext.getContextPath());//上下文路径(应用程序名称)
System.out.println(request.getContextPath());

全局容器

        ServletContext拥有作用域,可以储存数据到全局容器中

        储存数据:servletContext.setAttribute("name",value);

        获取数据:servletContext.getAttribute("name")

        移除数据:servletContext.removeAttribute("name")

ServletContext特点:

        唯一性:一个应用对应一个ServletContext

        生命周期:只要容器不关闭或者应用程序不卸载,ServletContext就一直存在

作用域总结

        HttpServletRequest:一次请求,请求响应之前有效

        HttpSession:一次会话开始,浏览器不关闭或者不超时之前有效

        ServletContext:服务器启动和服务器关闭之前有效

监听器(Listener)

        监听器用于监听一下重要事件,监听器对象可以在事件发生之前,之后做出相应的处理

常用的三个监听器

        application: ServletContextListener(服务器启动关闭事件监听)*

         request: ServletRequestListener (请求访问的监听事件) 

        session: HttpSessionListener(session启动关闭事件监听)

过滤器

        过滤器(Filter)是处于客户端与服务器目标资源之间的一道过滤技术

过滤器作用

        执行地位在Servlet之前.,客户端发送请求是,会先经过Filter,在到达目标Servlet中:响应时,会根据执行流程再次反向执行Filter

        可以解决多个Servlet共性代码的冗余问题,例如(乱码处理,登录验证)

编写过滤器

        Servlet API提供了一个Filter接口,开发人员编写一个java类实现这个接口即可,这个java类被称为过滤器

        实现过程

                编写java类实现Filter接口

                在doFilter方法中编写拦截逻辑

                设置拦截路径

        过滤器配置

                注解配置:在自定义的Filter类上使用注解WebFilter(value=“/过滤目标资源”)

                xml配置

<!--过滤器的xml配置  -->
  <filter>
  <!--名称-->
    <filter-name>sf</filter-name>
    <!--过滤器类全称-->
    <filter-class>com.qf.web.filter.SecondFilter</filter-class>
  </filter>
 <!--映射路径配置-->
  <filter-mapping>
     <!--名称-->
    <filter-name>sf</filter-name>
     <!--过滤的url匹配规则和Servlet类似-->
    <url-pattern>/*</url-pattern>
  </filter-mapping>

过滤器路径

        

过滤器的过滤路径通常有三种形式:

精确过滤匹配 ,比如/index.jsp   /myservlet1

后缀过滤匹配,比如*.jsp、*.html、*.jpg

通配符过滤匹配/*,表示拦截所有。注意过滤器不能使用/匹配。
	/aaa/bbb/* 允许

过滤器链和优先级

        过滤链

                客户端对服务器请求之后,服务器在调用Servlet之前执行一组过滤器,这一组过滤器就叫做过滤器链

        每个过滤器实现某个特定的功能,当第一个Filter的doFilter方法被调用时,Web服务器会创建一个代表Filter链的FilterChain对象传递给该方法。在doFilter方法中,开发人员如果调用了FilterChain对象的doFilter方法,则Web服务器会检查FilterChain对象中是否还有filter,如果有,则调用第2个filter,如果没有,则调用目标资源。

        过滤器优先级

                在一个web应用中,可以开发编写多个Filter,这些Filter组合起来可以叫做Filter链接

                优先级

                        如果为注解的话,是按照类全名称的字符串顺序决定作用顺序

                        如果实web.xml,安装filter-mapping注册顺序,从上往下

                        web.xml配置高于注解

                        如果注解和xml配置同时配置,会创建多个过滤器对象,造成过滤多次 

                

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值