java中的session

会话技术
序号 名称 数据存放位置
1 Cookie技术 会话数据保存在浏览器客户端。
2 Session技术 会话数据保存在服务器端。

2、Session技术

2.1、引入

Cookie的局限:

1)Cookie只能存字符串类型。不能保存对象

2)只能存非中文。

3)1个Cookie的容量不超过4KB。

如果要保存非字符串,超过4kb内容,只能使用session技术!!!

Session特点:会话数据保存在服务器端。(内存中)

1.2、Session技术核心

HttpSession类:用于保存会话数据

Session相关API
序号 类别 API
1 创建或得到session对象
HttpSession request.getSession()

HttpSession request.getSession(boolean create)

2 设置session对象
void setMaxInactiveInterval(int interval)  : 设置session的有效时间

void invalidate()     : 销毁session对象

String getId()  : 得到session编号

3 保存会话数据到session对象
void setAttribute(String name, Object value)  : 保存数据

Object getAttribute(String name)  : 获取数据

void removeAttribute(String name) : 清除数据

1.3、Session原理

问题: 服务器能够识别不同的浏览者!!!

代码解读:HttpSession session = request.getSession();

1)第一次访问创建session对象,给session对象分配一个唯一的ID,叫JSESSIONID

2)把JSESSIONID作为Cookie的值发送给浏览器保存

Cookie cookie = new Cookie("JSESSIONID", sessionID);

response.addCookie(cookie);

3)第二次访问的时候,浏览器带着JSESSIONID的cookie访问服务器

4)服务器得到JSESSIONID,在服务器的内存中搜索是否存放对应编号的session对象。

5)如果找到对应编号的session对象,直接返回该对象

6)如果找不到对应编号的session对象,则创建新的session对象,继续走1、2的流程

结论:通过JSESSIONID的cookie值在服务器找session对象!!!!!

获取或生成session对象Demo03.java


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

package com.rk.http.b_session;

import java.io.IOException;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

/**

 * 获取或生成session对象

 * @author lsieun

 *

 */

public class Demo03 extends HttpServlet

{

    @Override

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException

    {

        //通过访问HttpSession对象,使Tomcat服务器生成名为JSESSIONID的Cookie

        HttpSession session = request.getSession();

    }

}

显示session对象信息Demo04.java


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

package com.rk.http.b_session;

import java.io.IOException;

import java.io.PrintWriter;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

/**

 * 显示session对象信息

 * @author lsieun

 *

 */

public class Demo04 extends HttpServlet

{

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException

    {

        response.setContentType("text/html;charset=utf-8");

        PrintWriter out = response.getWriter();

        

        HttpSession session = request.getSession(false);

        if(session != null)

        {

            out.write("JSSESSIONID: " + session.getId());

        }

        else

        {

            out.write("还没有Session对象");

        }

    }

}

1.4、Sesson细节

1)String getId()  : 得到session编号(也就是Cookie中JSESSIONID的值)

2)两个getSession方法:

getSession(true) / getSession(): 创建或得到session对象。没有匹配的session编号,自动创建新的session对象。

getSession(false):得到session对象。没有匹配的session编号,返回null

3)void setMaxInactiveInterval(int interval)  : 设置session的有效时间(单位:秒)

session对象销毁时间:

3.1 默认情况30分服务器自动回收

3.2 修改session回收时间

3.3 全局修改session有效时间


1

2

3

4

<!-- 修改session全局有效时间:分钟 -->

<session-config>

   <session-timeout>60</session-timeout>

</session-config>

完整的web.xml文件,如下:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

<?xml version="1.0" encoding="UTF-8"?>

<web-app version="2.5"

    xmlns="http://java.sun.com/xml/ns/javaee"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 

    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

  

  <!-- 修改session全局有效时间:分钟 -->

  <session-config>

      <session-timeout>60</session-timeout>

  </session-config>

  

</web-app>

3.4.手动销毁session对象 void invalidate(): 销毁session对象

向session中添加会话数据Demo05.java


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

package com.rk.http.b_session;

import java.io.IOException;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

/**

 * 向session中添加会话数据

 * @author lsieun

 *

 */

public class Demo05 extends HttpServlet

{

    @Override

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException

    {

        HttpSession session = request.getSession();

        //向session中保存会话数据

        session.setAttribute("username""rk");

    }

}

修改session会话数据和有效时间Demo06.java


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

package com.rk.http.b_session;

import java.io.IOException;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

/**

 * 修改session会话数据和有效时间

 * @author lsieun

 *

 */

public class Demo06 extends HttpServlet

{

    @Override

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException

    {

        HttpSession session = request.getSession();

        //向session中保存会话数据

        session.setAttribute("username""lsieun");

        //修改session的有效时间

        session.setMaxInactiveInterval(5*60);//保存为5分钟

    }

}

销毁session对象Demo07.java


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

package com.rk.http.b_session;

import java.io.IOException;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

/**

 * 销毁session对象

 * @author lsieun

 *

 */

public class Demo07 extends HttpServlet

{

    @Override

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException

    {

        HttpSession session = request.getSession(false);

        if(session!=null){

            session.invalidate();//手动销毁

        }

        System.out.println("销毁成功");

    }

}

获取session的相关信息Demo08.java


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

package com.rk.http.b_session;

import java.io.IOException;

import java.io.PrintWriter;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

/**

 * 获取session的相关信息

 * @author lsieun

 *

 */

public class Demo08 extends HttpServlet

{

    @Override

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException

    {

        response.setContentType("text/html;charset=utf-8");

        PrintWriter out = response.getWriter();

        

        HttpSession session = request.getSession(false);

        if(session!=null){

            String sessionId = session.getId();//获取JSESSIONID

            int maxInactiveInterval = session.getMaxInactiveInterval();//获取Session的有效时间

            String username = (String)session.getAttribute("username");//获取Session中的会话数据

            out.write("JSSESSIONID: " + sessionId + "<br/>");

            out.write("username: " + username + "<br/>");

            out.write("Session的有效时间是: " + maxInactiveInterval + "<br/>");

        }

        else

        {

            out.write("还没有Session对象");

        }

    }

}

4)在一些北京Java培训机构里面都讲过这个,如何避免浏览器的JSESSIONID的cookie随着浏览器关闭而丢失的问题


1

2

3

4

5

6

7

/**

 * 手动发送一个硬盘保存的cookie给浏览器

 */

String sessionId = session.getId();

Cookie cookie = new Cookie("JSESSIONID",sessionId);

cookie.setMaxAge(1*30*24*60*60);//Cookie保存1个月的时间

response.addCookie(cookie);

完整代码Demo09.java


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

package com.rk.http.b_session;

import java.io.IOException;

import java.io.PrintWriter;

import javax.servlet.ServletException;

import javax.servlet.http.Cookie;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

/**

 * 案例:如何避免浏览器的JSESSIONID的cookie随着浏览器关闭而丢失的问题

 * @author lsieun

 *

 */

public class Demo09 extends HttpServlet

{

    @Override

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException

    {

        response.setContentType("text/html;charset=utf-8");

        PrintWriter out = response.getWriter();

        

        HttpSession session = request.getSession(false);

        if(session!=null){

            /**

             * 手动发送一个硬盘保存的cookie给浏览器

             */

            String sessionId = session.getId();

            Cookie cookie = new Cookie("JSESSIONID",sessionId);

            cookie.setMaxAge(1*30*24*60*60);//Cookie保存1个月的时间

            response.addCookie(cookie);

            

            out.write("已经将JSESSIONID保存入Cookie,重启浏览器后,仍然可以看JSESSIONID信息。");

        }

        else

        {

            out.write("没有找到Session对象,重启浏览器后不会看到JSESSIONID信息");

        }

    }

}

 

时间: 2024-11-03 21:38:09

java中的session的相关文章

java中设置session过期时间

Web容器 apache-tomcat-8.0.26\conf\web.xml中设置 <session-config> <!-- 时间单位为分钟 --> <session-timeout>30</session-timeout> </session-config> Web工程 在项目工程的web.xml中设置 <session-config> <!-- 时间单位为分钟 --> <session-timeout>

转 java中的session

书中讲:以下情况,Session结束生命周期,Servlet容器将Session所占资源释放:1.客户端关闭浏览器2.Session过期3.服务器端调用了HttpSession的invalidate()方法. "一个浏览器就是一个新session,关了浏览器session就结束了"session 是在服务器端建立的,浏览器访问服务器会有一个sessionid,浏览器端通过sessionid定位服务器端的session,session的创建和销毁由服务器端控制.当浏览器关闭后,sessi

java中清空session

session.removeAttribute("sessionname")是清除SESSION里的某个属性.     session.invalidate()是让SESSION失效.     或许你可以用getAttributeNames来得到所有属性名,然后再removeAttribute 我是如下在Spring中實現的: private void initSession(HttpServletRequest request){  Enumeration em = request.

【JAVA学习】struts2的action中使用session的方法

尊重版权:http://hi.baidu.com/dillisbest/item/0bdc35c0b477b853ad00efac 在Struts2里,如果需要在Action中使用session,可以通过下面两种方式得到1.通过ActionContext class中的方法getSession得到2.Action实现org.apache.struts2.interceptor.SessionAware接口的方式来对session进行操作 下面先看一个采用第一种方式,在action中得到sessi

JAVA中Session

会话状态的维持是开发Web应用所必须面对的问题,有多种方法可以来解决这个问题,如使用Cookies,hidden类型的表单域,或直接把状态信息加到URL中等,还有Servlet本身提供了一个HttpSession接口来支持会话状态的维持,在这里我们主要介绍基于这个接口的会话状态的管理. Session的发明是为了填补HTTP协议的局限.请注意HTTP协议是如何工作的--用户发出请求,服务器作出响应,这种用户端和服务器端的联系就是离散的,非连续的.HTTP协议不能提供允许服务器跟踪用户请求的功能.

Java中的会话Cookie&amp;&amp;Session

会话技术 会话: 一次会话中包含多次请求和响应. 一次会话:浏览器第一次给服务器资源发送请,会话建立,直到有一方断开为止 功能:在一次会话的范围内的多次请求之间共享数据 方式: 客户端会话技术:cookie 服务器端和会话技术:session cookie: 概念: 客户端会话技术,将数据保存在客户端 快速入门: 使用步骤 创建cookie对象,绑定数据 new Cookie(String name,String value) 发送cookie对象 response.addCookie(Cook

Java中如何使用session

几乎所有的Web开发语言都支持Session功能,Servlet也不例外. Servlet/JSP中的Session功能是通过作用域(scope)这个概念来实现的. 作用域分为四种,分别为: page 在当前页面有效(仅用于JSP中)request 在当前请求中有效session 在当前会话中有效application 在所有应用程序中有效 是不是看不太明白?page因为仅用于JSP中,这里只讲述其他三种作用域.首先要声明的一点,所谓“作用域”就是“信息共享的范围”,也就是说一个信息能够在多大的

Java中容易被你忽略的细节(一)

1.在一个程序当中代码段访问了同一个对象从单独的并发的线程当中,那么这个代码段叫"临界区" 怎么解决呢:使用同步的机制对临界区进行保护 同步的两种方式:同步块和同步方法 对于同步来说都是使用synchronized方法 每一个对象都有一个监视器,或者叫做锁. java用监视器机制实现了进程之间的异步执行 2.Struts框架基于MVC模式 Struts的工作流程: 在web应用启动时就会加载初始化ActionServlet,ActionServlet从 struts-config.xm

SpringMVC - controller中获取session

平时使用springMVC 在方法中访问session中经常很自然地调用Servlet API. 用起来非常直观方便,一直没有多考虑什么. 比如这样: @RequestMapping(value = "/logout") public String logout(HttpSession session) { session.removeAttribute("user"); return "/login"; } 但毕竟这样对Servlet API产