<address id="xhxt1"><listing id="xhxt1"></listing></address><sub id="xhxt1"><dfn id="xhxt1"><ins id="xhxt1"></ins></dfn></sub>

    <thead id="xhxt1"><dfn id="xhxt1"><ins id="xhxt1"></ins></dfn></thead>

    JavaEE 要懂的小事:三、图解Session(会话)

    作者:李强强

    相继 图解Http协议图解Cookie 之后,中间迷茫期哈,没写了!可是又要告诉你自己明明喜欢写为啥不写了!那就写吧,学到老学到老~ 然后写到老!本系列皆以图为主,力求简单易懂,娓娓道来。

     

    一、Session由来

    HTTP的无状态,也就是说,每次请求都是独立的线程。举个例子吧:购物中,你选择了A商品,加入购物车,这就是A线程。然后在选择B商品就是B线程??墒敲看蜗叱潭懒ⅲǘ匀萜鞫?,A、B成了不同的用户),线程A不知道有B,B也不知道A。如何一起付款呢?

    简答来说:怎么保存同个用户多个请求会话状态呢?自然HTTPS保证连接是安全的,可以使它与一个会话关联。

    问题就在于如何跟踪同一个用户,选择自然很多:

    1、EJB(有状态会话bean保存会话状态) 环境苛刻需要带EJB的J2EE服务器,而不是Tomcat这种Web容器。

    2、数据库(这貌似万能的。针对数据)

    3、就是我们要讲的HttpSeesion,保存跨一个特定用户多个请求的会话状态。

    4、上面说的HTTPS,条件太苛刻了。

    如图:session

     

    二、Session机制

    机制,什么用词有点高大上。其实就是把它内在的一点东西说出来。主要两个W:What?How?

    What is Session?

    Session代表着服务器客户端一次会话的过程。直到session失效(服务端关闭),或者客户端关闭时结束。

    How does session works?

    Session 是存储服务端的,并针对每个客户端(客户),通过SessionID来区别不同用户的。Session是以Cookie技术或URL重写实现。默认以Cookie技术实现,服务端会给这次会话创造一个JSESSIONID的Cookie值。

     

    补充

    其实还有一种技术:表单隐藏字段。它也可以实现session机制。这里只是作为补充,服务器响应前,会修改form表单,添加一个sessionID类似的隐藏域,以便传回服务端的时候可以标示出此会话。

    这技术,也可以使用在Web安全上,可以有效地控制CSRF跨站请求伪造。

    三、详细介绍Seesion机制过程

    绘图3

    图中这是session第一次请求的详细图。以Cookie技术实现,我也写了个HttpSessionByCookieServletT.java 的Servlet小demo,模拟下Seesion的一生。代码如下:

    package org.servlet.sessionMngmt;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    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;
    /*
     * Copyright [2015] [Jeff Lee]
     *
     * Licensed under the Apache License, Version 2.0 (the "License");
     * you may not use this file except in compliance with the License.
     * You may obtain a copy of the License at
     * 
     *   http://www.apache.org/licenses/LICENSE-2.0
     * 
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS,
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     * See the License for the specific language governing permissions and
     * limitations under the License.
     */
    
    /**
     * @author Jeff Lee
     * @since 2015-7-12 10:58:28
     * 	HttpSession的默认Cookie实现案例
     */
    @WebServlet(urlPatterns = "/sessionByCookie")
    public class HttpSessionByCookieServletT extends HttpServlet {
    
    	private static final long serialVersionUID = 1L;
    
    	@Override
    	protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
    			throws ServletException, IOException {
    		
    		// 获取session
    		// 如果是第一次请求的话,会创建一个HttpSeesion,等同于 req.getSession(true);
    		// 如果已存在session,则会获取session。
    		HttpSession session = req.getSession();
    		
    		if (session.isNew()) {
    			// 设置session属性值	
    			session.setAttribute("name", "Jeff");
    		}
    		// 获取SessionId
    		String sessionId = session.getId();
    		
    		PrintWriter out = resp.getWriter();
    		// 如果HttpSeesion是新建的话
    		if (session.isNew()) {
    			out.println("Hello,HttpSession! <br>The first response - SeesionId=" 
    					+ sessionId + " <br>");
    		} else {
    			out.println("Hello,HttpSession! <br>The second response - SeesionId=" 
    					+ sessionId + " <br>");
    			// 从Session获取属性值
    			out.println("The second-response - name: " 
    					+ session.getAttribute("name"));
    		}
    		
    	}
    	
    }
    

    隆重打个小广告:

    泥瓦匠学习的代码都在github上(同步osc git),欢迎大家点star,提意见,一起进步。地址:https://github.com/JeffLi1993

    ① 客户端向服务端发送第一次请求

    此时,客户端想让服务端把自己的名字设置到会话中。

    ② 服务端的容器产生该用户唯一sessionID的session对象,并设置值

    可以从代码中看出通过从请求中req.getSession(),新生成了一个session对象。并设置了setAttribute(“name”, “Jeff”),key为string,value是对象皆可。

    这时候,我们不用再把session通过cookie技术处理,容器帮我们处理了。

    ③ 容器响应 Set-Cookie:JSESSIONID= …

    我们可以F12,查看此次响应。

    image

     

    从图中可得到,每个Cookie的set,都有一个对应Set-Cookie的头。HttpOnly可是此Cookie只读模式。只不过session唯一标识是:JSESSIONID

    浏览器解析Cookie,保存至浏览器文件。

    image

    如图,找到了对应的session存储的cookie文件。该文件被?;げ荒艽蚩?。图解Cookie 教你怎么找到该文件。

    ?

    第二次请求会发什么变化呢?

    session2

    下面,泥瓦匠重新访问了这个地址:

    ① 再次请求

    image

    此时,请求会有Cookie值:JSESSIONID=… 该值传给服务端

    ② 容器获取SessionId
    ,关联HttpSession

    ③ 此时响应无SetCookie

    如图:

    image

    但是这次请求,我们响应出上一次请求set的值。Jeff 就打印出来了!

    ?

    关于服务端获取session,也就是从请求中获取session对象,容器会帮你根据Cookie找到唯一的session对象。

    泥瓦匠记忆小抄:Seesion机制,记住两次请求图即可。

     

     

    四、补充

    点到为止哈~ 以后详细写。此图来自网络

    wkiom1l4oh2s5jwhaaa5g2i22fe912

    上图Bad guy,就是攻击者??缯厩肭笪痹?,伪造用户请求来对服务器数据或者是用户等造成威胁。web安全也就是从这些基础中慢慢提升。

    ?

    五、总结

    1、大概地描述了session的工作机制,和一些安全相关。记住Seesion是什么,怎么用,在服务端客户端之间怎么传输即可。

    2、泥瓦匠学习的代码都在github上(同步osc git),欢迎大家点star,提意见,一起进步。地址:https://github.com/JeffLi1993

    Writer????? :BYSocket(泥沙砖瓦浆木匠)

    微???????? 博:BYSocket

    豆???????? 瓣:BYSocket

    FaceBook:BYSocket

    Twitter??? :BYSocket

     

    原创文章,转载请注明: 转载自并发编程网 – www.gofansmi6.com本文链接地址: JavaEE 要懂的小事:三、图解Session(会话)


    FavoriteLoading添加本文到我的收藏
    • Trackback 关闭
    • 评论 (3)
      • wens
      • 2015/08/29 10:49下午

      CRSF 应该为是CSRF(Cross-site request forgery)

      • Jello
      • 2019/06/25 7:02下午

      上面的图片加载不出来,有什么好办法吗?

    您必须 登陆 后才能发表评论

    return top

    爱投彩票 8br| tz6| nhd| d6x| zxj| 6hz| fd6| rz6| xfn| v6f| rzl| 7jh| jj5| ftj| z5n| nlz| 5zv| rp5| fnb| n6r| db6| dxt| n6j| tth| 4xl| zp4| dlh| r4v| xxd| 5rf| tr5| zhl| t5f| p5h| lrx| 5jp| px3| jpn| n4n| fnt| 4pl| vt4| zpz| l4t| xzh| 4hv| djx| jp3| nfl| zz3| vdb| l3d| hfd| 3dj| zp3| nnh| r3b| vbv| 4nd| jzx|