专攻知识小点——回顾JavaWeb中的servlet(三)

HttpSession基本概述

**
**

1.HttpSession:是服务器端的技术。和Cookie一样也是服务器和客户端的会话。获得该对象是通过HTTPServletRequest的方法getSession()方法。此方法还有一个重载形式的方法,里面传入的是boolean类型。当为true时,功能不变;为false时,只查询。

2.HttpSession的底层其实就是Cookie的实现方式:即根据特殊的Cookie(JSESSIONID=HttpSession对象的id,由服务器生成,唯一的)的取值,在服务器的内存中根据此id进行查找这个HttpSession对象,找到了就继续服务;没有找到就创建一个新的HttpSession对象。

3.Session的运行机制:

a)当一个Session开始时,Servlet容器将创建一个HttpSession对象,在HttpSession对象中可以存放客户状态的信息(例如购物车)

b)Servlet容器为HttpSession分配一个唯一的标志符,称为Session ID,Servlet容器把Session ID作为Cookie保存客户的浏览器中

c)每次客户发出HTTP请求时,Servlet容器可以从HttpServletRequest对象中读取Session ID,然后根据Session ID找到响应的HttpSession对象,从而获取到客户的状态信息。

4.HttpSession的常用方法:

a)public Object getAttribute(String name):返回与此会话中的指定名称绑定在一起的对象,如果没有对象绑定在该名称下,则返回 null。

b)public void setAttribute(String name, Object value):使用指定名称将对象绑定到此会话。如果具有同样名称的对象已经绑定到该会话,则替换该对象。

c)public void removeAttribute(String name):从此会话中移除与指定名称绑定在一起的对象。如果会话没有与指定名称绑定在一起的对象,则此方法不执行任何操作。

d)public void invalidate():使此会话无效,然后取消对任何绑定到它的对象的绑定。

5.HttpSession对象的状态及转换(序列化)

a)更改内存中HttpSession对象的超时时间,可以通过修改web应用的web.xml文件,根元素下添加:

1

b)所有的bean对象最好都要实现一个Serializable接口,这样服务器就会在禁用此web应用时,用户的数据不会丢失,进行持久化存储。

HttpSession的案例

**
**

1.案例一:完成用户的一次性登录,用随机动态验证码的来进行验证。

细节代码1:

使用HttpSession存储随机生成的验证码

request.getSession().setAttribute("code", sb.toString());

从网页上得到的随机验证码:

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

使用HttpSession获得随机生成的验证码

String sessionCode = (String) request.getSession().getAttribute("code");

然后就可以判断code和sessionCode是否相等来进行响应的处理。

细节代码2:

指定秒数跳转到某个页面:response.setHeader(“Refresh”, “2;URL=/day08”);

细节代码3:

两种销毁HttpSession的方式:

a)销毁所有的HttpSession对象:request.getSession().invalidate();

b)销毁指定的HttpSession对象:request.getSession().removeAttribute(“user”);

2.案例二:简单购物原理案例,可以查看购物车,添加商品进购物车。

细节代码1:

当被链接的地址想要收到上一个地址的id来进行逻辑处理,可以在链接后面加上?id=2。如:购买

细节代码2:

搞一个购物车:先查有无购物车,没有,给你一个。有就直接用。

HttpSession session = request.getSession();    //得到cart的session值,值是List。        List<Book> cart = (List<Book>) session.getAttribute("cart");        //得到的值是空,就没有购物车        if(cart==null){//创建一个购物车            cart = new ArrayList<Book>();.            session.setAttribute("cart", cart);        }        cart.add(book);

细节代码3:

查看购物车时,如何判断购物车是否有货。

        HttpSession session  = request.getSession(false);        if(session==null){            out.write("对不起!您还未曾购物");        }else{            List<Book> cart = (List<Book>) session.getAttribute("cart");            if(cart==null){                out.write("对不起!您还未曾购物");            }else{                out.write("您购买的商品如下:<br/>");                for(Book b:cart){                    out.write(b.getName()+"<br/>");                }            }        }

细节代码4:

当我们希望用户在下次打开浏览器还能查看购物车里东西,可以使用Cookie对象,存储特定的信息(HttpSession的底层原理)。

3.案例3:防止表单的重复提交。

细节代码1:

在客户端,可以使用js脚本语言让用户提交一次后,按钮变灰。

form表单的写法:

<form id='f1' action=” RegistServlet” method=’post’>    <input id='bt1' type='button' value='注册' onclick='toSubmit()'/></form>

js实现提交一次后按钮变灰

<script type='text/javascript'>function toSubmit(){    document.getElementById('f1').submit();//按钮具备提交功能    document.getElementById('bt1').disabled=true;//提交一次变灰}</script>

细节代码2:

md5算法的实现

MessageDigest md = MessageDigest.getInstance("md5");    byte b[] = md.digest(message.getBytes());    BASE64Encoder base64 = new BASE64Encoder();    return base64.encode(b);//采用Base64编码转换字节序列为明文。

细节代码3:

可以在提交表单中增加一个type是hidde,来存储md5的算法后的数据,然后用session同时去存储md5的算法后的数据。数据指纹的算法好处是数据无论怎么变,长度始终一样。

<input type='hidden' name='token' value='"+token+"'/>    ----------------------------------------------------------------------------------------------------------    //生成一个随机的令牌String token = ""+System.currentTimeMillis()+new Random().nextLong();//算数据指纹,用MD5算法。token = MD5Util.md5(token);        //放入HttpSession中        request.getSession().setAttribute("token", token);

还有种方式是不用md5算法来生成唯一的一段序列:java.util.UUID:通用的唯一标识符

String token = UUID.randomUUID().toString();//唯一的一段序列。

细节代码4:

验证表单提交的hidde类型的令牌与服务器的令牌是否一致。

String formToken = request.getParameter("token");        String sessionToken = (String) request.getSession().getAttribute("token");        if(formToken.equals(sessionToken)){            //正常提交            System.out.println("保存了:"+name);            request.getSession().removeAttribute("token");        }else{            out.write("请不要重复提交");        }

3.案例3:客户端禁用Cookie后的会话数据保存问题。禁用Cookie时,输入//localhost还是可以保存数据的。当输入的地址非这个时,数据就无法保存。两种解决方法。

a)将URL重写:当URL重写时,既是用户访问资源时,浏览器地址栏会始终带着JSESSIONID=123。HttpServletResponse类里有一个智能方法encodeURL(String url),判断用户是否禁用了Cookie,没有禁用,则不重写;禁用了就重写。

b)在网站主页提示:为了更好访问本网站,请不要禁用您的Cookie。这种方式适用于大型网站重写URL费力的做法。

END

如果看到这里,说明你喜欢这篇文章,请 转发、点赞。同时 标星(置顶)本公众号可以第一时间接受到博文推送。


关注公众号“IT咸鱼”学习更多有关知识。
获取方法:
1、扫描下方二维码并关注:IT咸鱼
2、在IT咸鱼对话框回复关键词:”资料” 一并奉上。
3、也可直接添加小编微信:mu99908888 领取

Tags: