精华内容
下载资源
问答
  • Session 会话
    千次阅读
    2017-09-04 18:10:57

    HTTP 是一种”无状态”协议,所以客户端每次请求页面的时候,web服务器都不会保存之前的记录,但是web应用都会有维持关系的需求,所以就需要有Session作为媒介进行关系维护。

    维持Session的三种方式

    • Cookies

    一个 Web 服务器可以分配一个唯一的 session 会话 ID 作为每个 Web 客户端的 cookie,对于客户端的后续请求可以使用接收到的 cookie 来识别。

    android项目可以考虑用Cookies,我原来就用过。

    • hidden类型的表单

    一个 Web 服务器可以发送一个隐藏的 HTML 表单字段,以及一个唯一的 session 会话 ID
    <input type="hidden" name="sessionid" value="12345">,当表单被提交时,指定的名称和值会被自动包含在 GET 或 POST 数据中。每次当 Web 浏览器发送回请求时,session_id 值可以用于保持不同的 Web 浏览器的跟踪。

    但是点击常规的超文本链接(<a href=''>)不会导致表单提交,因此隐藏的表单字段也不支持常规的 session 会话跟踪。

    • URL 重写

    在每个 URL 末尾追加一些额外的数据来标识 session 会话,服务器会把该 session 会话标识符与已存储的有关 session 会话的数据相关联。
    例如,wiki/6Zeo5bqX5ZCO5Y-w566h55CG57O757uf5o6l5Y-j/20142171?t=1504509668660,session 会话标识符被附加为 t=1504509668660,标识符可被 Web 服务器访问以识别客户端。

    我们公司是前后端分离的,后台一般用Spring,前端就是用的这种方式,这种方式会给每个页面都分配一个sessionId。

    HttpSession 对象

    • Servlet 提供HttpSession接口,该接口提供了一种跨多个页面请求或访问网站时识别用户以及存储有关用户信息的方式

    • Servlet 容器使用这个接口来创建一个HTTP协议 客户端和服务器之间的session会话。会话持续一个指定的时间段,跨多个连接或页面请求

    • 调用 HttpServletRequest 的getSession()方法可以获取 HttpSession 对象

    HttpSession session = request.getSession();
    方法描述
    public Object getAttribute(String name)返回在该 session 会话中具有指定名称的对象,如果没有指定名称的对象,则返回 null。
    public Enumeration getAttributeNames()返回 String 对象的枚举,String 对象包含所有绑定到该 session 会话的对象的名称。
    public long getCreationTime()返回该 session 会话被创建的时间,以毫秒为单位。
    public String getId()返回一个包含分配给该 session 会话的唯一标识符的字符串。
    public long getLastAccessedTime()返回客户端最后一次发送与该 session 会话相关的请求的时间,以毫秒为单位。
    public int getMaxInactiveInterval()返回 Servlet 容器在客户端访问时保持 session 会话打开的最大时间间隔,以秒为单位。
    public void invalidate()指示该 session 会话无效,并解除绑定到它上面的任何对象。
    public boolean isNew()如果客户端还不知道该 session 会话,或者如果客户选择不参入该 session 会话,则该方法返回 true。
    public void removeAttribute(String name)将从该 session 会话移除指定名称的对象。
    public void setAttribute(String name, Object value)使用指定的名称绑定一个对象到该 session 会话。
    public void setMaxInactiveInterval(int interval)在 Servlet 容器指示该 session 会话无效之前,指定客户端请求之间的时间,以秒为单位。

    Session示例

    package com.jty.servlet;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    /**
     * Created by TaoYuan on 2017/9/4 0004.
     */
    public class TestSession extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doPost(req, resp);
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //如果不存在则创建
            HttpSession session = req.getSession(true);
            //创建时间
            String createTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(session.getCreationTime()));
            //最后会话时间
            String lastAccessTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(session.getLastAccessedTime()));
    
            String title = "Test Session";
            Integer visitCount = 0;//访问次数
            String visitCountKey = "visitCount";//访问次数 key
            String userIDKey = "userID";//用户id key
            String userID = "TaoYuan";//用户id
    
            // 检查网页上是否有新的访问者
            if (session.isNew()){
                session.setAttribute(userIDKey, userID);
            } else {
                visitCount = (Integer)session.getAttribute(visitCountKey);
                visitCount = visitCount + 1;
                userID = (String)session.getAttribute(userIDKey);
            }
            session.setAttribute(visitCountKey,  visitCount);
    
            // 设置响应内容类型
            resp.setContentType("text/html;charset=UTF-8");
            PrintWriter out = resp.getWriter();
    
            String docType = "<!DOCTYPE html>\n";
            out.println(docType +
                    "<html>\n" +
                    "<head><title>" + title + "</title></head>\n" +
                    "<body bgcolor=\"#f0f0f0\">\n" +
                    "<h1 align=\"center\">" + title + "</h1>\n" +
                    "<h2 align=\"center\">Session 信息</h2>\n" +
                    "<table border=\"1\" align=\"center\">\n" +
                    "<tr bgcolor=\"#949494\">\n" +
                    "  <th>Session 信息</th><th>值</th></tr>\n" +
                    "<tr>\n" +
                    "  <td>id</td>\n" +
                    "  <td>" + session.getId() + "</td></tr>\n" +
                    "<tr>\n" +
                    "  <td>创建时间</td>\n" +
                    "  <td>" +  createTime +
                    "  </td></tr>\n" +
                    "<tr>\n" +
                    "  <td>最后访问时间</td>\n" +
                    "  <td>" + lastAccessTime +
                    "  </td></tr>\n" +
                    "<tr>\n" +
                    "  <td>用户 ID</td>\n" +
                    "  <td>" + userID +
                    "  </td></tr>\n" +
                    "<tr>\n" +
                    "  <td>访问统计:</td>\n" +
                    "  <td>" + visitCount + "</td></tr>\n" +
                    "</table>\n" +
                    "</body></html>");
    
    
        }
    }
    

    删除Session

    当您完成了一个用户的 session 会话数据,您有以下几种选择:

    • 移除一个特定的属性: 您可以调用 public void removeAttribute(String name) 方法来删除与特定的键相关联的值。
    • 删除整个 session 会话: 您可以调用 public void invalidate() 方法来丢弃整个 session 会话。
    • 设置 session 会话过期时间: 您可以调用 public void setMaxInactiveInterval(int interval) 方法来单独设置 session 会话超时。
    • 注销用户: 如果使用的是支持 servlet 2.4 的服务器,您可以调用 logout 来注销 Web 服务器的客户端,并把属于所有用户的所有 session 会话设置为无效。
    • web.xml 配置: 如果您使用的是 Tomcat,除了上述方法,您还可以在 web.xml 文件中配置 session 会话超时,如下所示:
      <session-config>
        <session-timeout>15</session-timeout>
      </session-config>
    • TIP:
      • Tomcat 中默认的 30 分钟超时时间。
      • getMaxInactiveInterval() 方法会返回 session 会话的超时时间,以秒为单位。
      • 如果在 web.xml 中配置 session 会话超时时间为 15 分钟,那么 getMaxInactiveInterval() 会返回 900。

    今天碰到个特别蛋疼的问题

    127.0.0.1可以访问,localhost不能访问的问题

    更多相关内容
  • Session会话

    千次阅读 2020-05-17 12:54:52
    3、每个客户端都有自己的一个Session会话 4、Session会话中,我们经常用来保存用户登录之后的信息 5、Session会话是保存在服务器上的 二、如何创建和获取Session。 创建和获取Session,他们使用的API是相同...

    一、Session介绍

          1、Session就是一个接口(HttpSession)

          2、Session就是一个会话,用来维护客户端和服务器之间关联的一种技术

          3、每个客户端都有自己的一个Session会话

          4、Session会话中,我们经常用来保存用户登录之后的信息

          5、Session会话是保存在服务器上的

    二、如何创建和获取Session。

         创建和获取Session,他们使用的API是相同的。

                      request.getSession():第一调用该方法时,是创建Session,之后调用都是获取Session

         isNew():判断到底是不是新创建的Seesion. 

                      true:表示新创建的。

                      false:表示获取的是之前创建的

        每个会话都有的一个身份证号,也就是ID值,而且这个ID值是唯一的。

         getId():得到Session的会话ID值

    protected void createOrGetSession(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            // 创建和获取Session会话对象
            HttpSession session = req.getSession();
            // 判断 当前Session会话,是否是新创建出来的
            boolean isNew = session.isNew();
            // 获取Session会话的唯一标识 id
            String id = session.getId();
    
            resp.getWriter().write("得到的Session,它的id是:" + id + " <br /> ");
            resp.getWriter().write("这个Session是否是新创建的:" + isNew + " <br /> ");
            
        }
    /**
         * 往Session中保存数据
         * @param req
         * @param resp
         * @throws ServletException
         * @throws IOException
         */
        protected void setAttribute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            req.getSession().setAttribute("key1", "value1");
            resp.getWriter().write("已经往Session中保存了数据");
    
        }
    /**
         * 获取Session域中的数据
         * @param req
         * @param resp
         * @throws ServletException
         * @throws IOException
         */
        protected void getAttribute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            Object attribute = req.getSession().getAttribute("key1");
            resp.getWriter().write("从Session中获取出key1的数据是:" + attribute);
        }

    三、Session生命周期控制

    1、public void setMaxInactiveInterval(int interval):设置Session的超时时间(单位为秒),超过指定的时间,Seesion就会被销毁。值为正数的时候,设定Session的超时时长,值为负数的时候,表示Session永不超时。
    
    2、public int getMaxInactiveInterval():获取Session的超时时间.
    
    3、Session默认的超时时间是30分钟。因为在Tomcat服务器的配置文件web.xml中默认有以下配置:他就表示配置了当前Tomcat服务器下所有的Session超时配置时间为:30分钟。  可以在自己项目的web.xml中修改Session的默认超时时间。
    
    4、Session的超时是指,客户端两次请求的最大间隔时长。
    
    5、public void invalidate():让当前session会话马上超时(销毁)。
    

       <session-config>

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

     </session-config>

    protected void defaultLife(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            // 获取了Session的默认超时时长
            int maxInactiveInterval = req.getSession().getMaxInactiveInterval();
    
            resp.getWriter().write("Session的默认超时时长为:" + maxInactiveInterval + " 秒 ");//1800秒
    
        }
    /**
         * 设置session超时时间为3秒
         * @param req
         * @param resp
         * @throws ServletException
         * @throws IOException
         */
        protected void life3(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            // 先获取Session对象
            HttpSession session = req.getSession();
            // 设置当前Session3秒后超时
            session.setMaxInactiveInterval(3);
    
            resp.getWriter().write("当前Session已经设置为3秒后超时");
        }

     

    protected void deleteNow(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            // 先获取Session对象
            HttpSession session = req.getSession();
            // 让Session会话马上超时
            session.invalidate();
    
            resp.getWriter().write("Session已经设置为超时(无效)");
        }

     四、浏览器与Session之间关联的技术内幕

    session技术,底层其实是基于Cookie技术来实现的。同时也说明了关闭了浏览器Session就没有了。如下图:

    Expires/Max-Age:这个字段值为Session,一关浏览器,这个cookie就被删除了,所以下次请求的时候只能是重新创建Session

     

     

    展开全文
  • 本书详细阐述了php中的session会话固定漏洞可能引发的安全问题,叙述了php代码审计的一些tips。
  • 主要介绍了微信小程序保持session会话的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 本文实例总结了PHP session会话操作技巧。分享给大家供大家参考,具体如下: 会话技术 session 将会话数据存储与服务器端,同时使会话数据可以区分浏览器 为每个会话数据建立独立的会话数据区(来存储当前会话的全部...
  • 针对该问题,提出了基于有序模型Session会话的高效共享方案。保持原IP地址,保证系统不会出现机器宕机,复制集群统一管理Session,使任何一台机器上都拥有相同Session状态。构建基于Session有序模型,对会话数据进行...
  • 主要介绍了php使用MySQL保存session会话的方法,涉及php操作session及数据库的相关技巧,需要的朋友可以参考下
  • 主要介绍了Zend Framework入门教程之Zend_Session会话操作,结合实例形式详细分析了Zend_Session会话操作的具体使用技巧,需要的朋友可以参考下
  • JavaWeb中的Session会话

    2022-04-03 15:42:17
    每个客户端都有自己的一个session会话。【在打开浏览器打开一个网站之后,知道关闭浏览器。这期间就叫做会话】 如何创建Session和获取session: 创建session:使用方法request.getSession(); 获取session:...

    Session是JavaWeb的一种约束是一个接口,session就是会话,是用来维护一个客户端和服务器之间进行关联的技术。每个客户端都有自己的一个session会话。【在打开浏览器打开一个网站之后,知道关闭浏览器。这期间就叫做会话】

    如何创建Session和获取session:

    创建session:使用方法request.getSession();

    获取session:使用方法request.getSession();方法。

    【第一次调用request.getSession();方法的时候是进行创建session对象,以后调用request.getSession();方法就是在获取session对象。】

    既然是创建和调用都是使用一个方法,那么据需要判断获取的session对象是不是新建的使用

    session.isNew()方法。【返回值true标识刚创建,flase表示之前就进行了创建】

    session的生命周期控制【也就是超时控制】:

    超时控制的常用方法:

    SetMaxInactivelnterval(int interval) 设置Session的超时时间(以秒为单位) ,超过指定的时常,session就会被销毁。默认是在打开网站到关闭浏览器。

    interval:  如果是正数的话,那么就会在超时时间后继续销毁

                  如果是负数的话,那么将永远不会超时。

    Invalidate()方法:作用是使session立即超时。

    GetMaxctiveInterval()方法:获取session的超时时间。

    上述的方法只是对单一的session进行的操作,可以在web.xml文件中进行对于全部的session进行操作,示例如下:

    代码示例:

      @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            resp.setContentType("text/html;charset=UTF-8");//解决中文乱码
            HttpSession session = req.getSession();//获取session对象
            session.setMaxInactiveInterval(3);//设置session 3秒后继续销毁
            boolean aNew = session.isNew(); //判断session是不是新创建的
            if (aNew==true){
            resp.getWriter().write("新创建的session");
            }else{
                resp.getWriter().write("不是新创建的session");
            }
            
        }

    session域对象的特点:

        session域的作用范围:在一次会话中所有的Servlet及其jsp

    代码示例:

    
      @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
            HttpSession session = req.getSession();
            session.setAttribute("uusername","sdjisdos");
    
        }
    
    
    
    // jsp中的内容
    <head>
        <title>Title</title>
    </head>
    <body>
    <% 
       session.getAttribute("username");
    %>
    </body>
    </html>
    

    session的底层原理:

       session的使用依赖与cookie
     

    展开全文
  • 主要介绍了zf框架的session会话周期及次数限制使用示例,需要的朋友可以参考下
  • cookie 和 session 的理解 和使用场景 以及应用案例

    会话

    一、简介

    客户端服务器连接开始,请求和响应的过程中都属于⼀次会话。客户端和服务器交流的过程,这个过程是⼀个持续的过程,当关闭客户端或者服务器 该次会话结束。再次过程中都属于同⼀次会话,不管访问时哪个⻚⾯或者 哪个Servlet都属于该会话 ⼀次会话指的是:就好⽐打电话,A给B打电话,接通之后,会话开始,直到挂断电话,该次会话就结束了,⽽浏览器访问服务器,就跟打电话⼀样,浏览器A给服务器发送请求,访问web程序,该次会话就已经接通,其中不管浏览器发送多少请求(就相当于接通电话后说话⼀样),都视为⼀次会话,直到浏览器关闭,本次会话结束。其中注意,⼀个浏览器就相当于⼀部电话,如果使⽤⽕狐浏览器,访问服务器,就是⼀次会话了,然后打开google浏览器,访问服务器,这是另⼀个会话,虽然是在同⼀台电脑,同⼀个⽤户在访问,但是,这是两次不同的会话。

    二、作用、

    • 因为HTTP协议是⽆状态的,所以很显然服务器不可能知道我们已经在上⼀次的HTTP请求中通过了验证。当然,最简单的解决⽅案就是所有的请求⾥⾯都带上⽤户名和密码,这样虽然可⾏,但⼤⼤加重了服务器的负担(对于每个request都需要到数据库验证),也⼤⼤降低了⽤户体验(每个⻚⾯都需要重新输⼊⽤户名密码,每个⻚⾯都带有登录表单)。既然直接在请求中带上⽤户名与密码不可⾏,那么就只有在服务器或客户端保存⼀些类似的可以代表身份的信息了,所以就有了cookie与session,cookie和session⽤来跟踪⽤户的整个会话。

    • 在程序中,会话跟踪是很重要的事情。理论上,⼀个⽤户的所有请求操作都应该属于同⼀个会话,⽽另⼀个⽤户的所有请求操作则应该属于另⼀个会话,⼆者不能混淆。例如,⽤户A在超市购买的任何商品都应该放在A的购物⻋内,不论是⽤户A什么时间购买的,这都是属于同⼀个会话的,不能放⼊⽤户B或⽤户C的购物⻋内,这不属于同⼀个会话。

    • ⽽Web应⽤程序是使⽤HTTP协议传输数据的。HTTP协议是⽆状态的协议。⼀旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建⽴新的连接。这就意味着服务器⽆法从连接上跟踪会话。即⽤户A购买了⼀件商品放⼊购物⻋内,当再次购买商品时服务器已经⽆法判断该购买⾏为是属于⽤户A的会话还是⽤户B的会话了。要跟踪该会话,必须引⼊⼀种机制。Cookie和session就是这样的⼀种机制。它可以弥补HTTP协议⽆状态的不⾜。

    三、Cookie

    3.1、理解

    Cookie:本意是⼩点⼼ ⼩甜点 ⼩饼⼲。

    创建⼀个cookie,即servlet发送到Web浏览器的少量信息,由浏览器保存,然后发送回服务器。cookie的值

    可以唯⼀标识客户端,因此cookie通常⽤于会话管理。

    3.2、原理

    那么如何跟踪会话呢,我们需要掌握该会话的原理就清楚了:

    原理:

    Cookie是解决HTTP⽆状态性的有效⼿段,服务器可以设置或读取Cookie中所包含的信息。当⽤户登录后,

    服务器会发送包含登录凭据的Cookie到⽤户浏览器客户端,⽽浏览器对该Cookie进⾏某种形式的存储(内存或硬盘)。⽤户再次访问该⽹站时,浏览器会发送该Cookie(Cookie未到期时)到服务器,服务器对该凭据进⾏验证,合法时使⽤户不必输⼊⽤户名和密码就可以直接登录。

    本质上讲,Cookie是⼀段⽂本信息。客户端请求服务器时,如果服务器需要记录⽤户状态,就在响应⽤户请求时发送⼀段Cookie信息。客户端浏览器保存该Cookie信息,当⽤户再次访问该⽹站时,浏览器会把Cookie做为请求信息的⼀部分提交给服务器。服务器检查Cookie内容,以此来判断⽤户状态,服务器还会对Cookie信息进⾏维护,必要时会对Cookie内容进⾏修改。

    在这里插入图片描述

    简⽽⾔之我们可以这么理解:

    • 当从浏览器发送请求到服务器后,servlet创建cookie,保存少量数据,发送浏览器。

    • 浏览器获得服务器发送的cookie数据,将⾃动的保存到浏览器端。

    • 下次访问时,浏览器将⾃动携带cookie数据发送给服务器。

    浏览器查看Cookie的⽅式:

    在这里插入图片描述

    3.3、使用

    1、Cookie创建

    Cookie cookie = new Cookie(String key,String value);
    

    key:表示cookie的名字

    value:表示cookie中保存的数据

    2、设置有效时间 不受浏览器关闭的影响

    为何要设置有效时间呢?因为浏览器关闭后该会话就结束了,因此要设置有效时间来保证浏览器关闭后

    Cookie会话还存在,单位为秒

    cookie.setMaxAge(int expiry);
    
    • 默认值为 -1 :代表浏览器关闭后,也就是会话结束后,cookie就失效了,也就没有了;

    • expiry>0 :代表浏览器关闭后,cookie不会失效,仍然存在。并且会将cookie保存到硬盘中,直到设置时

    间过期才会被浏览器⾃动删除;

    • expiry=0:删除cookie。不管是之前的expiry=-1还是expiry>0,当设置expiry=0时,cookie都会被

    浏览器给删除。

    3、 设置有效路径

    • 有效路径 默认路径 :创建cookie的Servlet的上⼀层路径

      cookie.setPath("/应⽤名/xx");

    • 哪些Servlet可以获取该cookie: 访问路径为/应⽤名/xx以及其⼦路径都可以访问到

    4、发送给浏览器

    response.addCookie(cookie);
    

    5、获取Cookie

    Cookie[] cookies = request.getCookies();
    
    if(cookies!=null) {
     	for (Cookie cookie : cookies) {
     		// 获取cookie的名称
    		 String name = cookie.getName();
    		 // 获取cookie的值
    		 String value = cookie.getValue();
    		 System.out.println(name+":::"+value);
     	} 
    }
    

    3.4、特点

    1、Cookie中只能以键值对的形式保存字符串类型的数据

    2、Cookie中保存的数据有⼤⼩限制,⼀般不超过4KB

    3、Cookie是保存在客户端的,安全性较差

    4、Cookie默认有效期是浏览器关闭即销毁,所以如果想持久保存Cookie对象,⼀定要设置有效期,并且有效期时间单位是秒。

    3.5、使用场景

    1、记住⽤户名

    登录时,在服务器端获取到⽤户名,然后创建⼀个cookie,将⽤户名存⼊cookie中,发送回浏览器端,然后浏览器下次在访问登录⻚⾯时,先拿到cookie,将cookie中的信息拿出来,看是否保存了该⽤户名,如果保存了,那么直接⽤他,如果没有,则⾃⼰⼿写⽤户名。cookie需要将所有信息都保存在客户端。因此cookie存在着⼀定的安全隐患,例如本地cookie中保存的⽤户名和密码被破译,或cookie被其他⽹站收集。

    2、历史记录

    ⽐如购物⽹站,都会有我们的浏览记录的,实现原理其实也是⽤cookie技术,每浏览⼀个商品,就将其存⼊

    cookie中,到需要显示浏览记录时,只需要将cookie拿出来遍历即可。

    3.6、案例、记住账号

    // 我们通过代码演示使⽤场景中的第⼀种需求:
    // 代码示例:
    SaveUserServlet代码:
    @WebServlet("/login")
    public class SaveUserServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws
    ServletException, IOException {
     //解决中⽂乱码处理
     req.setCharacterEncoding("utf-8");
     resp.setContentType("text/html;charset=utf-8");
        //模拟⽤户的登录场景,假设给定⽤户名和密码 ⽤户名:admin 密码:123456
     //1.获取表单数据
     String username = req.getParameter("username");
     String password = req.getParameter("password");
     //2.登录判断
     if("admin".equals(username)&&"123456".equals(password)){
     //登录成功-->将⽤户的信息保存到Cookie中,下次登录时不需要填写⽤户名及密码了
     Cookie c1 = new Cookie("name",username);
     Cookie c2 = new Cookie("pwd",password);
     //设置⽣存时间
     c1.setMaxAge(60*60*24*7);
     c2.setMaxAge(60*60*24*7);
     //返回给浏览器保存
     resp.addCookie(c1);
     resp.addCookie(c2);
     resp.sendRedirect("login_success.jsp");
     }else{
     //登录失败,重新登录,并给提示
     req.setAttribute("msg","⽤户名或者密码不正确");
     req.getRequestDispatcher("login.jsp").forward(req,resp);
     }
     }
    }
    
    // 登录⻚⾯login.jsp:
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html> <head> <title>登录⻚⾯</title>
    </head> <body>
    <%
     //获取浏览器Cookie
     Cookie[] cookies = request.getCookies();
     if(cookies!=null){
     //遍历每⼀个Cookie找到保存⽤户信息的Cookie
     for(Cookie c:cookies){
     if("name".equals(c.getName())){
     //获取cookie中保存的⽤户名
     String uname = c.getValue();
     //保存到page共享域中
     pageContext.setAttribute("username",uname);
     }
     if("pwd".equals(c.getName())){
     String upwd = c.getValue();
     pageContext.setAttribute("password",upwd);
     }
         }
     }
    %>
    <form action="login">
     <span id="msg" style="color: red">${msg}</span> <br>
     ⽤户名:<input type="text" name="username" value="${username}"/> <br>&nbsp;&nbsp;&nbsp;:<input type="password" name="password"
    value="${password}"/> <br>
     <input type="submit" value="登录">
    </form>
    </body>
    </html>
    
    登录成功⻚⾯ login_success.jsp
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html> <head> <title>登录成功⻚⾯</title>
    </head> <body>
    欢迎⽤户登录成功!!!
    </body>
    </html>
    

    演示效果:

    登录失败效果:

    在这里插入图片描述

    登录成功后再⼀次访问登录⻚⾯的效果

    在这里插入图片描述

    四、Session

    3.1、理解

    可以跨多个⻚⾯请求或访问⽹站来识别⽤户,并存储有关该⽤户的信息。servlet容器使⽤此接⼝在HTTP客户端和HTTP服务器之间创建会话。会话将在指定的时间段内持续,跨越⽤户的多个连接或⻚⾯请求。⼀个会话通常对应于⼀个⽤户,该⽤户可能会多次访问⼀个站点。服务器可以通过多种⽅式维护会话,例如使cookie或重写URL。

    3.2、原理

    ⾸先浏览器请求服务器访问web站点时,程序需要为客户端的请求创建⼀个session的时候,服务器⾸先会检查这个客户端请求是否已经包含了⼀个session标识、称为SESSIONID,如果已经包含了⼀个sessionid则说明以前已经为此客户端创建过session,服务器就按照sessionid把这个session检索出来使⽤,如果客户端请求不包含session id,则服务器为此客户端创建⼀个session并且⽣成⼀个与此session相关联的session id,sessionid 的值应该是⼀个既不会重复,⼜不容易被找到规律以仿造的字符串,这个sessionid将在本次响应中返回到客户端保存,保存这个sessionid的⽅式就可以是cookie,这样在交互的过程中,浏览器可以⾃动的按照规则把这个标识发回给服务器,服务器根据这个sessionid就可以找得到对应的session

    在这里插入图片描述

    在运⾏记住密码项⽬时,通过浏览器查看我们发现Cookie中保存处理⽤户名和密码外,还有⼀个JSESSIONID,这个就是发送请求时创建的session对象对应的id。

    在这里插入图片描述

    3.3、使用

    1、获取session对象

    HttpSession session = request.getSession();
    

    2、保存数据到session中

    session.setAttribute(String 绑定名, Object 绑定值);
    

    3、获取session数据

    Object session.getAttribute("绑定名");
    

    4、有效时间 单位秒 默认30分钟,可以去tomcat中conf下web.xml⽂件查看

    session.setMaxInactiveInterval(int expiry);
    

    5、销毁session对象

    session.invalidate();
    

    3.4、特点

    1、存储在服务器端

    2、默认超时时间为30分钟

    3、Session做为第⼆⼤域对象,在⼀个会话范围内的数据是可以共享的

    4、Session存储的数据可以是任意类型

    3.5、使用场景

    1、⽤户登录时的安全校验

    2、 购物⻋

    3.6、购物车案例

    四、Cookie 和 Session 的区别

    1、 Cookie和Session都是会话技术,Cookie是运⾏在客户端,Session是运⾏在服务器端。

    2、 Cookie有⼤⼩限制以及浏览器在存cookie的个数也有限制,Session是没有⼤⼩限制和服务器的内存⼤⼩

    有关。

    3、 Cookie只能保存字符串数据,Session可以保存任意类型数据

    4、 Cookie有安全隐患,通过拦截或本地⽂件找得到你的cookie后可以进⾏攻击。

    5、Session是保存在服务器端上会存在⼀段时间(默认30分钟)才会消失,如果session过多会增加服务器的压

    和 Session 的区别

    1、 Cookie和Session都是会话技术,Cookie是运⾏在客户端,Session是运⾏在服务器端。

    2、 Cookie有⼤⼩限制以及浏览器在存cookie的个数也有限制,Session是没有⼤⼩限制和服务器的内存⼤⼩

    有关。

    3、 Cookie只能保存字符串数据,Session可以保存任意类型数据

    4、 Cookie有安全隐患,通过拦截或本地⽂件找得到你的cookie后可以进⾏攻击。

    5、Session是保存在服务器端上会存在⼀段时间(默认30分钟)才会消失,如果session过多会增加服务器的压

    ⼒。

    展开全文
  • Spring Boot Session 会话管理

    千次阅读 2022-01-20 18:25:15
    Spring Boot Session 会话管理是用于安全控制一个用户或者实体对基于网络的应用/服务的多个请求的过程。 HTTP用于网站和浏览器之间的交流,而会话则是同一个用户创建的一系列的HTTP请求和事务。 会话管理的实现规定...
  • Session会话注销漏洞

    千次阅读 2021-07-15 16:16:34
    危害:如果未能清空Session认证会话,该认证会话将持续有效,此时攻击者获得该Session认证会话会导致用户权限被盗取。 漏洞检测 该项测试主要在用户注销退出系统授权后,判断授权认证SessionID值是否依然有 效。...
  • 主要介绍了PHP cookie与session会话基本用法,结合实例形式分析了PHP cookie与session会话基本存储、设置、删除等相关使用方式,需要的朋友可以参考下
  • NULL 博文链接:https://shaozhen.iteye.com/blog/946680
  • 因为很多接口都需要使用cookie和session来记录登录状态,而很多接口必须要又一个登录状态才可以请求成功,Requests中的Session会话管理的作用就是自动的记录cookie和session的登录状态。
  • Session会话机制

    2019-03-19 22:23:43
    Session的官方定义是:Session:在计算机中,尤其是在网络应用中,称为“会话控制”。Session 对象存储特定用户会话所需的属性及配置信息。 说白了Session就是一种可以维持服务器端的数据存储技术。 Session主要有...
  • 一般我们的 session 过期时间默认为 30 分钟,有的用户认为 30 分钟太短了,有时候临时有事出去了,回来已经过期了,工作还没... * 当跳出shiro servlet时如error-page容器会为jsessionid重新分配值导致登录会话丢失!
  • javaweb项目中session会话的保持

    千次阅读 2019-05-31 09:14:06
    nginx+Tomcat反向代理实现session会话保持 飞来的翅膀 1人评论 6631人阅读 2018-04-11 10:01:11 概述:企业应用中nginx+tomcat是当前主流架构之一,当网站访问量很大的...
  • shiro——session会话管理

    万次阅读 2019-08-23 18:02:53
    1.2 SessionManager 会话管理 1.3 SessionListener 会话监听 2. 会话持久化 2.1 SessionDAO接口 2.2AbstractSessionDAO类 2.3 CachingSessionDAO 类 2.4 EnterpriseCacheSessionDAO 类 2.5 Memo...
  • session会话保持

    千次阅读 2017-06-18 23:30:26
    什么是会话保持,有什么作用 会话保持是指在负载均衡器上有一种机制,在作负载均衡的同时,还保证同一用户相关连的访问请求会被分配到同一台服务器上。 会话保持有什么作用呢,举例说明一下 如果有一个用户访问...
  • 负载均衡之session会话保持

    千次阅读 2019-08-23 20:44:45
    session会话保持原理 1. 什么是会话保持? 会话保持是负载均衡最常见的问题之一,也是一个相对比较复杂的问题。会话保持有时候又叫做粘滞会话(Sticky Sessions)。会话保持是指在负载均衡器上的一种机制,可以识别...
  • 如何删除 Session 会话数据

    千次阅读 2019-09-20 12:10:21
    当完成了一个用户的 session 会话数据,会有以下几种选择去删除session会话数据。 移除一个特定的属性:可以调用 public void removeAttribute(String name)这个 方法来删除与特定的键相关联的值。 删除整个 ...
  • plsql上关闭session会话

    千次阅读 2021-01-13 08:35:50
    Oracle多用户操作有时候会造成session阻塞,形成了锁表等问题。可以使用sql语句进行查询,但使用PL/SQL查看或杀掉oracle的session更为方便。  1、打开PL/SQL Developer,输入用户名密码和数据库等信息。  2、在...
  • python+requests封装session会话

    千次阅读 2021-09-22 11:27:24
    r.json()["data"]["token"] print(token_info) session.headers.update({"Authorization": "token "+token_info}) return session if __name__ == '__main__': session = get_token() print(session.headers) #time....
  • Session会话周期

    千次阅读 2018-02-01 21:03:57
    今天想和大家分享一个关于Session的话题: 当浏览器关闭时,Session就被销毁了? 我们知道Session是JSP的九大内置对象(也叫隐含对象)中的一个,它的作用是可以保 存当前用户的状态信息,初学它的时候,认为...
  • 1.首先知道会话什么时候超时,利用shiro中的session会话监听,每隔一段时间监听。 2.当监听会话过期时,利用WebSocket推送消息到前台提示"您长时间没有操作,请重新登录!!!"的提示框 步骤安排 1.首先创建 配置...
  • 如何在Tensorflow2.0以上的版本继续使用session会话功能 只需要在开始的 导入部分 将 //导入 import tensorflow as tf ...... //创建会话 with tf.Session() as sess: 替换成 //导入 import tensorflow.compat.v1 ...
  • 一、ip_hash: ip_hash使用源地址哈希算法,将同一客户端的请求总是发往同一个后端服务器,除非该服务器不可用。 ip_hash语法: ... 当后端服务器宕机后,session会丢失; 来自同一局域网的客户端会被转发到

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 408,674
精华内容 163,469
关键字:

session会话

友情链接: tanchishe.zip