javaweb中的session和cookie

session,是服务端用来保存用户信息的技术,与之相对应的是cookie,同样也是保存用户的数据,不过它是存放在客户端的。cookie分为持久性cookie和会话cookie,持久性cookie是被我们设置了保存时间的cookie(通过setMaxAge()),它会被保存在硬盘上的某个文件中,即便我们关闭了浏览器,只要没有超过保存时间,它就不会失效;会话cookie是没有被设置保存时间的cookie,它保存在浏览器的内存中,只要我们关闭浏览器,它就会失效。session是在服务端为每一个用户保存其信息的区域,那么,当我们再次访问服务器,服务器是如何辨别用户的身份,也就是说,它该取用哪个用户的session呢?原来,服务器将cookie返回给客户端的时候,会将一个sessionId放到cookie中,这个sessionId是session的唯一标识,当用户再次访问,会连同这个sessionId给带过去,这样服务器就能区分谁是谁了。

//UserServlet
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //处理乱码,设置请求编码
        req.setCharacterEncoding("UTF-8");
        String name = req.getParameter("name");
        String pwd = req.getParameter("pwd");
        //Cookie创建
        Cookie c1=new Cookie("name", URLEncoder.encode(name, "UTF-8"));
        Cookie c2=new Cookie("pwd", URLEncoder.encode(pwd, "UTF-8"));
        c1.setMaxAge(60*2);//设置有效时间为2分钟,默认是关闭浏览器失效
        resp.addCookie(c1);
        resp.addCookie(c2);
        resp.sendRedirect("success.jsp");
    }
//success.jsp
<%
        Cookie[] cookies=request.getCookies();
        for (Cookie c : cookies) {
            //判断是否是被编码过的name和pwd
            if (c.getName().equals("name") || c.getName().equals("pwd")){
                //对值进行解码处理
                String s = URLDecoder.decode(c.getValue(), "UTF-8");
                System.out.println(c.getName()+":"+s);//name:张三    pwd:234567
            }else{
              	//下面这个就是我们的sessionId
                System.out.println(c.getName()+":"+c.getValue());//JSESSIONID:658476B5A435A494E16341560BAB4665
            }
        }
    %>

在上面这个示例中,我们需要注意两个问题:

1.cookie无法保存中文value,如果你想要存放中文的话,需要对value进行编码处理,并且在取出的时候需要进行解码。

2.在创建了cookie之后,一定要将其加入到response对象中(使用addCookie())。

3.如果cookie的名字一样的话,比如说上面的c1和c2我取同一个名字"name"的话,那么c2会将c1的value给覆盖。

HttpSession session = req.getSession();
 session.setAttribute("name", name);
 session.setAttribute("pwd", pwd);
 session.setMaxInactiveInterval(20);//设置session保存时间 session默认保存30分钟
 resp.sendRedirect("success.jsp");

//show.jsp
<%
        String name=(String) session.getAttribute("name");
        String pwd=(String) session.getAttribute("pwd");
        System.out.println(name+":"+pwd);//王舞:234567
    %>

注意问题:

1.会话是我们打开浏览器–》进行一系列操作–》关闭浏览器的过程,关闭浏览器后本次会话就结束了,如果再次打开浏览器并访问就取不到session里的东西了,除非将session中保存的内容写到某个位置,下次有人访问,再将它读出来。

2.除了使用setMaxInactiveInterval()设置session保存时间,也可以在web.xml中进行统一设置,

​ 50

3.如果使用setAttribute设置的名字一样的话,后面的会将前面的覆盖。

//简单的免登录示例
//index.jsp
<%!String username;%> 
<%
   username=(String) session.getAttribute("username");
%>
欢迎,<a href="show2.jsp"><%=username==null?"请登录":"用户"+username%></a>
//regist.jsp
 <form action="userServlet" method="get">
        用户名:<input type="text" name="username"/><br/>
        密码:<input type="password" name="password"/><br/>
        <input type="submit" value="登录"/>
    </form>
//UserServlet
req.setCharacterEncoding("UTF-8");
 String username = req.getParameter("username");
 String password = req.getParameter("password");
 HttpSession session = req.getSession();
 session.setAttribute("username", username);
 session.setAttribute("name", password);
 resp.sendRedirect("index.jsp");  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值