JavaWeb之HttpSession

时间:2016-11-17 22:33

——HttpSession

一、HttpSession概述
    1、HttpSession是由JavaWeb提供的,用来进行会话跟踪的类。
    2、session和cookie的区别
        session是服务器端对象,保存在服务器端,是由JavaWeb提供的,只有JavaWeb有。
        cookie保存在客户端,是由HTTP协议提供的。
    3、HttpSession是Servlet三大域对象之一,所以它也有setAttribute()、getAttribute()和removeAttribute()方法。
    4、HttpSession底层依赖Cookie或是URL重写。

二、HttpSession的作用
    1、会话范围
        会话范围是某个用户从首次访问服务器开始,到该用户关闭浏览器结束。

2、会话
        一个用户对服务器的多次连贯性请求,所谓连贯性请求,就是该用户多次请求中间没有关闭浏览器。

3、服务器会为每个客户端创建一个session对象,它们被服务器保存到一个Map中,这个Map被称为session缓存。
        *   Servlet中得到session对象:HttpSession session = request.getSession();
        *   JSP中得到session对象:session是JSP内置对象,不需要创建就可以直接使用。

4、session域的相关方法:
        void setAttribute(String name,Object value)
        Object getAttribute(String name)
        void removeAttribute(String name)

三、案例1
    演示session中会话的多次请求中共享数据
    *   AServlet:向session域中保存数据
        a.jsp:

<h1>向Session域保存数据</h1>

<%

//如果需要自己手动获取session对象,代码如下

//HttpSession session = request.getSession();

session.setAttribute("aaa","AAA");

%>

*   BServlet:从session域中获取数据
        b.jsp:

<h1>获取session中的数据</h1>

<%

String s = (String)session.getAttribute("aaa");

%>

<%=s %>

*   演示
        第一个请求:访问AServlet
        第二个请求:访问BServlet
    *   此时如果不关闭当前浏览器再打开新的浏览器窗口,则也能访问到b.jsp中的session对象,即也可以输出“AAA”

四、案例2
    演示保存用户登录信息(必须掌握)
    问题:
        为什么请求重定向需要包含完整Servlet路径?
            因为重定向是客户端根据URL重新发送请求,所以需要重写URL。

1、案例相关页面和Servlet
    *   login.jsp:登录页面
    *   successful1.jsp:只有登录成功才能访问的页面
    *   successful2.jsp:只有登录成功才能访问的页面
    *   LoginServlet.java:校验用户是否登录成功

2、各页面和Servlet内容
    *   login.jsp:提供登录表单,提交表单请求LoginServlet
    *   LoginServlet:获取请求参数,校验用户是否登录成功
        成功:保存用户信息到session域中,重定向到successful1.jsp页面,显示session域中的用户信息。
            重定向是客户端请求,必须加项目名。
        失败:保存错误信息到request域中,转发到login.jsp(login.jsp显示request域中的错误信息)
        如果需要进行跨请求获取参数,就是用session,如果只需要一个请求,则使用request,尽量使用范围小的域对象。
    *   successful1.jsp:从session域中获取用户信息,如果不存在,显示“您还没有登录”,存在则显示用户信息。
    *   successful2.jsp:从session域中获取用户信息,如果不存在,显示“您还没有登录”,存在则显示用户信息。

只要用户没有关闭浏览器,session就一直存在,那么保存在session中的用户信息也就存在,那么用户
    访问successful1.jsp和successful2.jsp就会成功。

代码如下:
------------------------------------------------------------------------------------------------------------------------------------------
login.jsp

<body>

<%-- 本页面提供登录表单,还要显示错误信息 --%>

<h1>登录</h1>

<%

//读取名字为cusername的Cookie

//如果为空显示:""

//如果不为空显示:cookie的值

String cusername = "";

//获取请求中所有的Cookie

Cookie[] cs = request.getCookies();

if(cs != null)//如果存在cookie

{

for(Cookie c : cs)//循环遍历所有的cookie

{

if("cusername".equals(c.getName()))//查找名为cusername的cookie

{

cusername = c.getValue();//获取这个cookie的值,赋给cusername变量

}

}

}

%>

<%--输出错误信息 --%>

<%

String errorMessage = "";

//获取request域中的错误信息

String message = (String)request.getAttribute("errorMessage");

if(message != null)

{

errorMessage = message;

}

%>

<font color="red"><b><%=errorMessage %></b></font>

<%--把cookie中的用户名显示到用户名文本框中 --%>

<form action="/day11_3/LoginServlet" method="post">

用户名:<input type="text" name="username" value="<%=cusername%>"/><br/>

密    码:<input type="password" name="password" /><br/>

<input type="submit" vale="登录" />

</form>

</body>

------------------------------------------------------------------------------------------------------------------------------------------

LoginServlet.java

//1、获取表单数据

//处理编码问题

request.setCharacterEncoding("utf-8");

//获取参数

String username = request.getParameter("username");

String password = request.getParameter("password");

//2、验证用户名和密码

if("admin".equalsIgnoreCase(username) && "admin".equalsIgnoreCase(password))

{

//将用户名保存到cookie中,发送给客户端浏览器

//当再次打开login.jsp时,login.jsp会读取request中的cookie,把它显示到用户名文本框中

Cookie cookie = new Cookie("cusername",username);//创建Cookie

cookie.setMaxAge(60*60);

response.addCookie(cookie);//保存cookie,最终会变成设置Set-Cookie的头

//3、登录成功,保存信息到session

HttpSession session = request.getSession();//获取Session对象

session.setAttribute("username", username);//在session域中保存用户名

//重定向到successful1.jsp

response.sendRedirect("/day11_3/session2/successful2.jsp");

}

else

{

//登录失败

//保存错误信息到request域中

request.setAttribute("errorMessage", "用户名或密码不正确");

//转发到login.jsp

RequestDispatcher rd = request.getRequestDispatcher("/session2/login.jsp");//得到转发对象

rd.forward(request, response);

}

-----------------------------------------------------------------------------------------------------------------------------------------

successful.jsp

<body>

<h1>Successful1</h1>

<%

String username = (String)session.getAttribute("username");

if(username == null)

{

//向request域中保存错误信息,转发到login.jsp

request.setAttribute("errorMessage","请先登录");

request.getRequestDispatcher("/session/login.jsp").forward(request, response);

return;

}

%>

<%=username %>登录成功

</body>

五、HttpSession原理

session保存在服务器,通过Cookie将SessionID传递给客户端。

request.getSession()方法
    1、获取Cookie中的JSESSIONID:
        *   如果sessionId不存在,就创建session,把session保存起来,把新创建的sessionId(JSESSIONID)保存到Cookie中。
        *   如果sessionId存在,通过sessionId查找session对象,如果没有查找到,创建session对象,把新创建的sessionId保存到Cookie中。
        *   如果sessionId存在,通过sessionId查找到session对象,那么就不会再创建session对象了。
        *   返回session对象。
    2、如果创建了新的session,浏览器会得到一个包含了sessionId的Cookie,这个Cookie的生命为-1,即只在浏览器内存中存在,如果不关闭浏览器,那么Cookie就一直存在。
    3、下次请求再执行request.getSession()方法时,因为可以通过Cookie中的sessionId找到session对象,所以与上一次请求使用的是同一session对象。
    4、服务器不会马上创建session,而是在第一次获取时(getSession()),才会创建Session对象。
    5、如果访问JSP页面,则会自动创建SESSION对象,因为Session对象是JSP内置对象。

getSession(false)、getSession(true)、getSession()方法的区别:
        getSession(false):如果session缓存中(Cookie中)不存在session,那么返回null,而不会创建session对象。
    
六、HttpSession其他方法
    String getId()
        获取sessionId。

UUID:生成一个随机的、不重复的、32位长度的、16进制字符串。
        UUID代码:
            //获取UUID对象

UUID uuid = UUID.randomUUID();

//将UUID对象转换成字符串

String string = uuid.toString();

//去掉“-”字符

string = string.replace("-", "");

//将字母转换成大写

string = string.toUpperCase();

sessionId的获取方式就是通过UUID来获取的。
        sessionId可以放到cookie中发送给客户端。

问题:sessionId的作用是什么?

int getMaxInactiveInterval()
        获取session的最大不活动时间(秒),默认为30分钟,当session在30分钟内没有使用,那么Tomcat会在session池中移除这个session。

void invalidate()
        让session失效,调用这个方法session会失效,当session失效后,客户端再次请求,服务器会为此次会话创建一个新的session,并在响应中给客户端新session的sessionId。可以用作退出登录按钮。

boolean isNew()
        查看session是否是新的,当客户端第一次请求时,服务器为客户端创建session,但这时服务器还没有响应客户端,也就是还没有把sessionId响应给客户端时,这时的session的状态为新。
        只要请求中不带cookie,那么session就是新的。当把sessionId放到cookie发送给客户端后,客户端再发送请求,那么session就是旧的。
        该方法可以用来判断是创建session还是返回session:request.getSession().isNew();

七、web.xml中配置session的最大不活动时间
    <session-config>
        <session-timeout>30</session-timeout>
    </session-config>

八、URL重写

就是把页面中所有的超链接路径,都使用response.encodeURL("....")进行处理。
 
    1、session依赖cookie,目的是让客户端发出请求时归还sessionId,这样才能找到它对应的session。
    2、如果客户端禁用了Cookie,那么就无法得到sessionId,所以session也就无法使用了。
    3、也可以使用URL重写来替代Cookie
        *   这让网站的所有超链接、表单中都添加一个特殊的请求参数,即sessionId。
        *   这样服务器可以通过获取请求参数得到sessionId,从而找到session对象。
    4、response.encodeURL(String url)
        *   该方法会对URL进行智能的重写:当请求中没有归还sessionId这个cookie,那么该方法会重写URL,否则不重写。
        *   URL必须是指向本站的URL。

时间: 2024-10-12 03:14:24

JavaWeb之HttpSession的相关文章

JavaWeb:HttpSession(一)

Session机制: 1).session机制采用的是在服务器端保持 HTTP 状态信息的方案 . 2).当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否包含了一个session标识(即sessionId),如果已经包含一个sessionId则说明以前已经为此客户创建过session,服务器就按照session id把这个session检索出来使用(如果检索不到,可能会新建一个,这种情况可能出现在服务端已经删除了该用户对应的session对象,但用户人为

JavaWeb:HttpSession(二)

早上花时间补完最后一点小总结: 1.关于 /:可以代表当前WEB 应用的根目录,也可以代表WEB 站点的根目录. 1)./ 如果交给浏览器解析,则代表WEB 站点的根目录:如果交给WEB 服务器解析,代表当前WEB 应用的根目录. 2).代表当前WEB 应用的根目录:在web.xml 文件中,映射路径:请求的转发  代表当前WEB 站点的根目录:超链接的 href 属性:请求的重定向中的 / 2.关于绝对路径: 1).写绝对路径肯定不会有问题,写相对路径可能会发生问题. 2).绝对路径:相对于当

超全面的JavaWeb笔记day11&lt;JSP&amp;Session&amp;Cookie&amp;HttpSession&gt;

1.JSP 2.回话跟踪技术 3.Cookie 4.HttpSession JSP入门 1 JSP概述 1.1 什么是JSP JSP(Java Server Pages)是JavaWeb服务器端的动态资源.它与html页面的作用是相同的,显示数据和获取数据. 1.2 JSP的组成 JSP = html + Java脚本(代码片段) + JSP动态标签 2 JSP语法 2.1 JSP脚本 JSP脚本就是Java代码片段,它分为三种: l <%...%>:Java语句: l <%=-%>

JavaWeb 后端 &lt;四&gt; 之 Cookie HttpSession 学习笔记

一.会话管理概述 1.什么是会话? 好比一次通话.打开浏览器,点击多次链接(发出多次请求和收到多次的响应),关闭浏览器,这个过程就是一次会话. 2.解决的问题是什么? 共享多次请求中产生的数据.比如购物车. 二.客户端技术:Cookie 0.HTTP协议的消息头 请求消息头:Cookie 客户端向服务器端传递信息 响应消息头:Set-Cookie 服务器端向客户端传递信息 1.Cookie详解: l  属性: name:Cookie的名称,必要的属性 value:Cookie的取值(不能为中文)

JavaWeb——HttpSession常用方法示例

HttpSession接口中方法 getId() getCreationTime() getLastAccessedTime() setMaxInactiveInterval() getMaxInactiveInterval() isNew():如果客户端请求消息中返回了一个与Servlet程序当前获得的HttpSession对象的会话标识号相同,则认为这个HttpSession对象不是新建的 invalidate() getServletContext() setAttribute() get

javaWeb基础知识----Cookie,Session

?HTTP协议是一种无状态的协议,WEB服务器本身不能识别出哪些请求是同一个浏览器发出的,浏览器的每一次请求都是完全孤立的 ?即使 HTTP1.1支持持续连接,但当用户有一段时间没有提交请求,连接也会关闭. ?怎么才能实现网上商店中的购物车呢:某个用户从网站的登录页面登入后,再进入购物页面购物时,负责处理购物请求的服务器程序必须知道处理上一次请求的程序所得到的用户信息. ?作为 web 服务器,必须能够采用一种机制来唯一地标识一个用户,同时记录该用户的状态 1.会话和会话状态 ?WEB应用中的会

javaweb学习总结(四十五)——监听器(Listener)学习二

一.监听域对象中属性的变更的监听器 域对象中属性的变更的事件监听器就是用来监听 ServletContext, HttpSession, HttpServletRequest 这三个对象中的属性变更信息事件的监听器. 这三个监听器接口分别是ServletContextAttributeListener, HttpSessionAttributeListener 和ServletRequestAttributeListener,这三个接口中都定义了三个方法来处理被监听对象中的属性的增加,删除和替换

Javaweb学习笔记5—Cookie&amp;Session

 前几天博客被黑了,导致博客登陆不上,把前几天应该发的东西的东西重新发一遍  今天来讲javaweb的第五阶段学习. Cookie和Session同样是web开发常用到的地方. 老规矩,首先先用一张思维导图来展现今天的博客内容. ps:我的思维是用的xMind画的,如果你对我的思维导图感兴趣并且想看到你们跟详细的备注信息,请点击下载 另外:如果图看不清的话请右击---在新窗口中打开会清楚很多. 一.会话管理技术概述 1 什么是会话? 这里的会话指的是web开发中的一次通话过程,当打开浏览

JavaWeb用户登录功能的实现

大四快毕业了,3年多的时间中,乱七八糟得学了一大堆,想趁找工作之前把所学的东西整理一遍,所以就尝试着做一个完整的JavaWeb系统,这几天试着做了一个用户登录的功能,分享给大家,肯定有很多不完善的地方,希望大家提提宝贵的意见,必将努力完善它. 我贴出此篇博客的目的是,将一些以后有可能用到的重复性的代码保存下来,用于以后需要时直接复制粘贴,所以,此篇博客大部分都是代码,讲解性的语句并不多,如果大家看得头疼,不如不看,以后万一用到的话再拿过来修修改改即可. 有可能用得到的部分:生成验证码的Java类