zoukankan      html  css  js  c++  java
  • Session随便写的(抄书笔记)

    会话是web开发中常用的一种对象。
    会话是存在于服务器端的对象,因此会话超时是保证性能效率的必要手段,本章将学习几种常用的使会话失效的办法。
    大多数容器都使用cookie作为会话跟踪的基础,但是cookie机制可能被客户端禁止。本章将学习如何使用URL重写,保证会话被禁止时会话机制仍然有效。

    客户端对服务器端一次连续的访问过程,称为会话
    HttpSession接口用来表示会话对象
    HttpSession中和属性有关的方法
        public void setAttribute(String name,Object value)
        public Object getAttribute(String name)
        public void removeAttribute(String name)
    通过请求对象的方法获得会话对象
    HttpServletRequest:
        public HttpSession getSession()获得与当前请求相关的Session对象,如果当前请求中不存在Session对象,则创建一个新的session对象返回
        public HttpSession getSession(boolean create) 如果参数为true,与getSession()没有区别,如果参数为false,当不存在session的时候直接返回null
        
    请求和会话都可以存储属性,但是有什么呢区别呢?
        请求和会话都可以存储属性,但是请求对象的生命周期短,除了请求转发可以将请求转发下去,其他情况下请求对象都会被重新创建。而会话对象在一次会话过程中,都会唯一维护一个会话对象。因此,只有存储到会话对象中的属性才考虑使用会话对象传递。只要请求范围使用的属性,都应该使用请求对象传递,以保证性能和效率
        
    JSP中的会话对象
        jsp中内置对象session,是HttpSession对象
        默认情况下,jsp总是创建session对象,可以直接使用
        
        我们知道在Servlet中使用Session对象之前,都必须使用请求对象获取会话对象:
            HttpSession session=request.getSssion();
        而如果在JSP中使用Session对象,可以直接使用Session内置对象
            <%
                Session.setAttribute("obj","test");
                String obj=(String)session.getAttribute("obj");
            %>
        内置对象session是容器声明并创建的对象,所以子啊JSP文件中不需要声明,可以直接使用,但是名字必须为session,大小写敏感。
        
        会话的实现机制:
        会话的实现依赖于容器
        大多数容器采用基于cooki的实现机制
        基于cookie的实现机制,采用名为JSESSIONID的cookie作为session的唯一标识
        HttpSession是容器创建的额对象,并存储在容器中,每个会话对象都与一个特定的客户端相关,那么容器是如何维护HttpSession对象与客户端一对一的关系的呢?大多数容器使用cookie机制来实现会话机制,例如Tomcat就是使用cookie机制实现会话跟踪。
        当容器创建一个新的HttpSession对象后,即生成一个随机数,称为会话id,并将id的值封装给一个名为JSESSIONID的cookie,返回给客户端存在内存中。当应用程序通过request.getSession()获得会话对象时,容器先从当前的request对象中获取JSESSIONID值,根据JSESSIONID值查找对应的session对象,如果存在,则返回使用,否则将创建新的对象返回.如果没有获取到JSESSIONID的值,认为当前请求没有相关联的session对象。
        由于jsp文件中总是默认创建session内置对象,所以只要访问一次jsp文件,容器就会创建一个session对象,创建一个session对象后,容器就会为该session生成一个随机数ID,是一个十六进制的随机整数,并把这个id存为一个名为JSESSIONID的cookie。因此下次访问该jsp文件时,就能获得一个名字是JSESSIONID的cookie,其值就是容器生成的会话id。
        
        URL重写
            通过修改客户端浏览器设置,可以禁止发送cookie
            如果cookie被禁止,那么基于cookie实现的session将失效
            为了解决cookie禁止session失效的问题,可以使用URL重写技术
            
            URL重写:
                就是通过HttpServletResponse中的encodeURL方法,将JSESSIONID的值强制追加到URL当中,保证即使cookie被阻止后JSESSIONID仍然能传递到服务器
                <a href="<%=response.encodeURL("getpersonal")%>">View my person info. </a> <br/>
                这里使用response.encodeURL将getpersonal的地址重新编码,将JSESSIONID的值强制加到URL中,保证即使cookie被阻止后JESSIONID依然能够被传递到服务器。

        观察这个图,你就发现,地址栏发生了变化:
                  
        会话超时
            为了有效使用内存,以及保证安全性,会话在一定时间内不被使用(称为会话超时),将被销毁
            有三种策略可以使会话超时:
                web.xml中配置会话超时时间(分钟)
                    <session-config>
                        <session-timeout>40</session-timeout>
                    </session-config>
                使用setMaxInactiveInterval设置超时时间
                    public void setMaxInactiveInterval(int interval) 对于具体的一个session对象,可以通过调用setMaxInactiveInterval方法设定最大不活动时间,超过这个时间会话没有被访问,即被容器销毁
                使用invalidate方法直接将某会话设置为失效
                    public void invalidate() 任何一个session对象,调用invalidate方法,都会被立即销毁,同时被绑定到session上的属性也将被解除,不能再次使用
                
            
            
       

  • 相关阅读:
    Java JDBC 连接ORACLE ORA-12505错误解决方法
    SqlServer 打开/关闭列自增
    【小程序】倒计时
    【MySQL 主从同步延迟的原因及解决办法】
    【Linux Mysql主从配置】整理主从配置遇到的坑!
    关于post和get传递参数的区别
    CSS基础属性介绍
    js-06-字符串
    js-07-事件
    js-08-数组学习
  • 原文地址:https://www.cnblogs.com/aigeileshei/p/5678184.html
Copyright © 2011-2022 走看看