javaweb-servlet 映射细节-cookie&session

33 篇文章 0 订阅
7 篇文章 0 订阅
  1. 3):<url-patternt>必须保证唯一性,而且必须使用/打头.

         4):Servlet的映射支持通配符映射(*:表示任意字符):
                 第一种写法:   /*, 任意的资源都可以访问该Servlet.     比: /m1   /m2
                  /system/*:请求的资源必须以/system/打头才可以访问.
                                                          /system/m1   可以进入
                                                          /m1   不可以进入
                               Servlet中,权限控制.
                 第二种写法:   *.拓展名, 比如:   *.do,  请求的资源必须以  .do  作为结尾才可以访问该Servlet.
            比如:   
                /xxx.do   可以进来
                /xxxx        进不来

                                       隐藏资源请求是什么系统开发的.

  2.  

        5):在映射Servlet的时候,<servlet-name>元素的文本内容不能是default.
            因为,在Tomcat中存在一个叫做default的Servlet,专门用于处理请求静态资源(html,css,js,图片等).
            在Tomcat根/conf/web.xml文件:若配置成default,则不能处理静态资源了

     

     

    6):配置项目的默认首页
               Tomcat根/conf/web.xml 最后几行

     <welcome-file-list>
            <welcome-file>index.html</welcome-file>
            <welcome-file>index.htm</welcome-file>
            <welcome-file>index.jsp</welcome-file>
        </welcome-file-list>

  3.  

    从Tomcat7开始,可以使用注解(WebServlet)来取代XML配置.
    使用注意:在web.xml文件的根元素中,存在属性,表示是否忽略扫描Web组件注解:
         metadata-complete="true" :   要忽略
         metadata-complete="false":   不忽略,    表示要进行注解扫描, 表示注解能生效
         不要改属性:       缺省情况等价于metadata-complete="false".

    回顾Servlet生命周期方法的执行流程:
      在启动Tomcat服务器的时候,没有对Servlet创建和初始化操作.
      在第一次服务端请求的时候才对Servlet创建和初始化操作.

  4. Servlet,要在服务器启动的时候,就创建好对象,并做好初始化操作.

  5. @WebServlet(loadOnStartup=1,initParams={
            @WebInitParam(name="encoding",value="utf-8")    
    },value="/cat")    //urlPatterns="/dog" 也可以作为资源路径
    public class ServletTest implements Servlet{...}

    比如:在SpringMVC中的DispatchServlet就是用来处理所有请求的,就应该在服务器启动的时候,就初始化.

    1.  

      Servlet的线程不安全问题:
         造成的根本原因是:Servlet是单例的,Servlet中的非static的成员变量只有一份,多个客户端好比是多个线程,都访问的是同一个空间.
      解决方案:
               1:让当前Servlet实现javax.servlet.SingleThreadModel接口.
                 该Servlet只能一个线程在执行,如果有多个线程就排队,如此的话,性能超低(已过时).
               2:在Servlet中不要使用成员变量,使用局部变量.
                 每一个用户,每一个请求都会调用service方法,而局部变量在service方法中,每一次都是新的空间.
             以后的dao  service我们都定义成成员变量
      Spring MVC是线程不安全的,处理请求的对象是单例的和Servlet类似.
      Struts2是线程安全的,因为每一个请求都是一个新的Action对象.

      ------------------------------------------------------------------------------------

      HTTP协议特点:(无状态,  健忘)

      一次会话:打开浏览器,访问某一个站点,多次请求,最后关闭浏览器,称之为一次会话.在一次会话中,多个请求之间无法共享数据,无法跟踪用户的会话信息.

      解决方案一:
          1):使用参数的传递机制.在每一个请求之间使用参数来传递需要共享的数据。http://localhost/day4/list?username=dafei
         但是请求需要共享的数据 暴 露在浏览器的地址栏中

      Cookie:
      Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。

       

      1:创建一个cookie
      //类比: map集, 以key-value对的形式存在
      Cookie Cookie = new Cookie(String name, string value);
      参数name:  cookie  名称
      参数value:  cookie   值
      注意: name  跟 value都是字符串类型
      2:将cookie给浏览器
      响应对象.addCookie(cookie);
      3:接受请求中的cookie
      Cookie[] cookies = req.getCookies();  //该站点所有的cookie


      4:cookie不支持中文
         注意:如果强制将中文设 给cookie会报错,除非添加cookie之前进行编码
      编码后的值 = URLEncoder.encode(cookie中的value, "UTF-8")
      在获得cookie时,进行解码
      解码后的值 =URLDecoder.decode( cookie中的value, "UTF-8");

      5:修该cookie中的值
      方式1:重新创建一个同名称的Cookie发给客户端覆盖原来的Cookie
      Cookie c = new  Cookie("currentName", "xiaofei");
      方式2:在原Cookie对象的基础上调用setValue("newValue"),再发给客户端覆盖原Cookie
      cookie.setValue("xiaofei");

      注意:要记得把新Cookie发给客户端覆盖原Cookie,比如:resp.addCookie(newCookie);

    2.  

      6: Cookie的分类(会话Cookie和持久化Cookie)
        会话Cookie:该Cookie仅在当前这次会话中有效(浏览器关闭后,Cookie无效了)
        持久Cookie:该Cookie在某段时间内有效(跟会话次数无关)
      关键方法:cookie对象.setMaxAge(int seconds);
           seconds > 0: 持久Cookie
           seconds = 0: 删除该Cookie
           seconds < 0: 会话Cookie
      7:删除 cookie
      cookie.setMaxAge(0);

       

       

      Cookie的缺陷,引出Session:
          1):多个人使用同一台电脑的时候,可以查看浏览器的Cookie,不安全. Cookie:currentName=WCG

          2):Cookie存储中文比较麻烦(得编码,再解码).
          3):Cookie的value是String类型,一个Cookie就只能存储一个数据,如果需要存储多个数据,就得写N个Cookie.
          4):一个站点对Cookie有限制:
            Cookie大小限制在4KB之内;
            一台服务器在一个客户端最多保存20个Cookie;
            一个浏览器最多可以保存300个Cookie;
          5):在设计上就有问题,考虑生活中问题.
             Cookie是浏览器和服务器之间数据交互的凭证,Cookie被人为删除了呢?
             在生活中,我们是把识别数据存储到服务端.

    3.  

      -------------------------------------------------------------------------

      Session:
      Session是服务器端技术,服务器为每一个用户的浏览器创建一个其独享的session对象,所以用户在访问服务器的web资源时,在服务器中可以把用户的数据放在各自的session中,当再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。

      Session其本质就是一个会话Cookie(浏览器关闭之后,Session就失效了)

      1:Session的创建和获取
      //获取当前客户端请求session,如果session存在, 则返回, 如果不存在, 创建一个
      HttpSession session = req.getSession(true);
      //获取当前客户端请求session,如果session存在, 则返回, 如果不存在, 不做操作
      HttpSession session = req.getSession(false);
      //等价于 req.getSession(true);
      HttpSession session = req.getSession();(推荐)
      2:使用Session存储数据
      session.setAttribute(String name, Object value);
      参数name:  存储数据的key值
      参数value:  存储数据, 可以是任意类型

      3:获取session数据
        1> 获取session对象
        2> 调用session对象.getAttribute(存储数据的key值)
              注意: 返回的是Object类型, 需要强转

      4:删除当前用户Session(用户注销登陆).
           1):删除Session中指定属性名的值.   删除单个
              session对象.removeAttrbute("currName");
           2):销毁Session对象(Session中所有的属性都不存在).   删除多个
              session对象.invalidate();    --> 运用场景:    注销
      5.Session的超时管理
        在一定时间之内,如果客户端和服务端没有交互(用户的两次操作之间不能超过该时间),
      则自动的销毁Session.
        session对象.setMaxInactiveInterval(60 * 10);//超过10分钟,销毁Session.
        Tomcat服务器的默认超时时间为:30分钟,Tomcat一般在20多分钟就销毁了.

      SESSION 使用细节
      1:一般的,我们存储到Session中的属性名称,要唯一,我们习惯 XXX_IN_SESSION:
        session对象.setAttribute("USER_IN_SESSION","dafei");

      2:若需要把多个数据存放到Session中,就得调用setAttribute方法N次,可以的.
        一般的,我们把需要存储的数据,封装成一个对象,然后在存储到Session中.
        把用户的信息,封装到user对象.
        session对象.setAttribute("USER_IN_SESSION",user对象);
      3:如果多台服务器之间需要共享Session,此时Session中的对象,必须实现java.io.Serializable(才能在网络上传输).    [集群]
        序 列 化: 把对象信息存储为二进制.
        反序列化: 把二进制信息恢复成对象.
        public class User implements java.io.Serializable{....}

      4:URL重写.
         Session是一种特殊的Cookie,而浏览器可以禁用Cookie.
         此时,需要在每一个资源之后,手动的携带session的ID.
         /session/list;jsessionid=ID,还是session.getId()?
         String url = response.encodeURL("/session/list");自动的在资源之后拼接;jsessionid=ID

         注意:开发中都不会取消接受Cookie的.

       

       

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值