• Tags
  •         
  • www.breakyizhan.com
  •    

    Session是什么?

    session机制是一种服务器端的机制,
    用来在无状态的HTTP协议下越过多个请求页面来维持状态和识别用户。
    当程序需要为某个客户端的请求创建一个session的时候,
    服务器首先检查这个客户端的请求里是否已包含了一个session标识。

    这个标识称为session id,
    如果已包含一个session id则说明以前已经为此客户端创建过session,
    服务器就按照session id把这个session检索出来使用,
    若没有创建过,则创建一个新的Session。

    Session是什么时候创建的呢?

    之前一直错误地理解为:
    当用户向服务器发起请求时,这个session便会立刻建立起来,
    但实际上却根本不是这样。

    在Servlet中,你肯定用过下面这句话,
    HttpSession session = request.getSession();
    如果当前没有session,则会立刻建立一个session;
    如果有session则返回当前session。
    这句话和
    HttpSession session = request.getSession(true);
    的效果是一样的。

    但是如果你写成
    HttpSession session = request.getSession(false);
    则不会自动建立session。
    若当前没有session,你所得到的seesion只会是一个null。

    我们先来测试访问一个jsp页面
    在servlet中我们写上
    HttpSession session = request.getSession(false);
    System.out.println(session==null);
    这句话不会建立session,如果当前没有seesion建立的话,控制台输出应该是true的。

    然后我们去访问页面。
    第一次访问:输出true(servlet先于jsp被执行),表示第一次访问时session为null
    第二次访问:输出false,session已存在,不为null
    这表示session的确已经被建立了,所以会有JSESSIONID。

    这是怎么回事呢?
    原因:
    默认的情况下,用户第一次访问jsp页面就会创建session,
    因为jsp中指令session默认配置为true,

    <%@ page session="true"%>
    下面我简单解释下jsp的运行过程,
    jsp运行时,先会转换成一个java文件然后再编译成class文件,最后输出结果。
    既然这样,我们就可以先查看下jsp生成的java文件
    打开
    %TOMCAT_HOME%\work\Catalina\localhost\
    然后打开所使用项目名称的文件夹,比如我的是:
    Test01\org\apache\jsp
    这个jsp文件夹下面就是你对应的jsp生成的java文件代码了,
    这个目录结构和你的WebRoot的jsp目录结构是一样的。
    打开/test/test_jsp.java

    里面有一句
    session = pageContext.getSession();
    因此当这个jsp页面执行时,这句话就会帮你创建session了。

    总结:
    session不是一打开网站就会立刻建立。
    它的建立需要基于下面两个条件中的任意一个:

    1:在servlet中手动调用
    HttpSession session = request.getSession();
    或者
    HttpSession session = request.getSession(true);
    2:jsp中没有写<%@ page session="false"%>
    (默认情况下它是<%@ page session="true"%>的)

    如果两个条件同时都不满足,那么你建立的只是一个无seesion的连接。

    Session创建的实例

    index.jsp

    
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%@ page session="false" %> <%--注意这一句,很重要--%>
    <html>
    <head>
    <title>IDEA搭建SpringMVC并用maven配置的小例子</title>
    </head>
    <%--<link rel="stylesheet" href="/asset/css/style.css"/>--%>
    <%--<script type="text/javascript" src="/plugs/js/jquery-1.7.2.js"></script>--%>
    
    <body>
    <form id="userForm" action="/user/find" method="post">
    用户名:<input type="text" name="username"><br>
    密码:<input type="password" name="password">
    <button type="button">登录</button>
    <%--<button type="button" onclick="login()">登录</button>--%>
    </form>
    </body>
    <%--<script>
    function login() {
    $.ajax({
    type: 'post',
    url: $('#userForm').attr('action'),
    data: $('#userForm').serialize(),
    dataType: 'json',
    success: function (data) {
    if (data.result = "success") {
    // alert("登录成功");//阻塞的,点击弹出框后,才能到“登录成功”的界面
    location.href = '/user/success';
    } else {
    alert("用户名或者密码错误!");
    }
    }
    });
    }
    </script>--%>
    </html>
    
    

     

    package com.springmvc.controller;
     
    /**
     * IDEA搭建SpringMVC并用maven配置的小例子
     */
     
    import com.springmvc.entity.User;
    import com.springmvc.service.UserService;
    import org.apache.log4j.Logger;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
     
    import javax.annotation.Resource;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
     
    @Controller
    @RequestMapping("/user")
    public class ViewController {
        private Logger logger = Logger.getLogger(ViewController.class);
        @Resource(name = "UserService")
        private UserService userService;
     
        @RequestMapping("/index")
        public String index(HttpServletRequest request, HttpServletResponse response) {
            logger.info("进入 index 方法");
            HttpSession httpSession = request.getSession();
            return "index";
        }
    
    

     

     

     

    1,第1次访问

    Session是什么时候创建的?

    Session是什么时候创建的?

    1,第2次访问

    Session是什么时候创建的?

    Session是什么时候创建的?

    2,第1次访问

    Session是什么时候创建的?

    Session是什么时候创建的?

    2,第2次访问

    Session是什么时候创建的?

    Session是什么时候创建的?

    总结:
    session不是一打开网站就会立刻建立。
    它的建立需要基于下面两个条件中的任意一个:

    1:在servlet中手动调用

    HttpSession session = request.getSession();
    或者
    HttpSession session = request.getSession(true);
    2:jsp中没有写<%@ page session="false"%>

    (默认情况下它是<%@ page session="true"%>的)

    如果两个条件同时都不满足,那么你建立的只是一个无seesion的连接。

    Session是什么时候创建的?

     
    转载请保留页面地址:https://www.breakyizhan.com/java/4946.html