九、初学servlet之cookie与session

1、Cookie

        cookie是服务器存储在客户端计算机上的文本文件,并保留了各种跟踪信息。由于存放在客户端电脑,因此信息不安全。

        服务器脚本向浏览器发送一组 Cookies。例如:姓名、年龄或识别号码等。

        浏览器将这些信息存储在本地计算机上,以备将来使用。

        当下一次浏览器向 Web 服务器发送任何请求时,浏览器会把这些 Cookies 信息发送到服务器,服务器将使用这些信息来识别用户。

        怎么使用Cookie?

        导包:import javax.servlet.http.Cookie;

        1)、创建cookie对象

Cookie cookie = new Cookie("name","value");

        name:代表cookie的名称key
        value:代表当前key名称所代表的值

        2)、设置最大生存期

cookie.setMaxAge(60*60*24); 

        单位是秒。设置为0,cookie不会保存;不设置值时,当前会话session中一直有效,结束会话cookie被删除。

        3)、发送cookie到响应头

response.addCookie(cookie);

        Servlet 可以通过请求的方法request.getCookies()访问Cookie,该方法将返回一个 Cookie对象的数组。下面是一个使用cookie的例子,包含了定义、获取、设置cookie的方法。

package pers.zky.cookie.util;

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;
//处理get请求信息的servlet
public class TestCookie extends HttpServlet {
    public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException {
        //定义两个String,接收上次登录存储在cookie中的信息
        String firstName = "";
        String lastName = "";
        //获取本次输入的参数
        String first_name = request.getParameter("first_name");
        String last_name = request.getParameter("last_name" );
        //通过request对象获取cookie数组
        Cookie[] cookies = request.getCookies();
        //若数组不为空,则根据cookie数组获取上次登录信息
        if(cookies != null){
            for (int i = 0; i < cookies.length; i++) {
                if(cookies[i].getName().equals("first_name")) firstName = cookies[i].getValue();
                if(cookies[i].getName().equals("last_name"))  lastName = cookies[i].getValue();
            }
        }
        //创建两个cookie存储本次登录信息
        Cookie first_cookie = new Cookie("first_name",first_name);
        Cookie last_cookie = new Cookie("last_name",last_name);
        //设置cookie的最大生存期
        first_cookie.setMaxAge(60); 
        last_cookie.setMaxAge(60); 
        //添加cookie到response对象
        response.addCookie(first_cookie);
        response.addCookie(last_cookie);
        //输出相关信息到页面
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        out.println("本次登录信息:<br/>");
        out.println("firstName:"+first_name+"<br/>");
        out.println("lastName :"+ last_name+"<br/>");
        out.println("上次登录信息:<br/>");        
        out.println("firstName:"+firstName+"<br/>");
        out.println("lastName :"+ lastName+"<br/>");
    }
}


<!-- 在web.xml中配置servlet -->
<servlet>
    <servlet-name>TestCookie</servlet-name>
    <servlet-class>pers.zky.cookie.util.TestCookie</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>TestCookie</servlet-name>
    <url-pattern>/testCookie</url-pattern>
</servlet-mapping>


<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!-- 首页 -->
<html>
    <head>
        <meta charset="utf-8">
        <title>TestCookie</title>
    </head>
    <body>
        <form action="testCookie" method="get">
            FirstName:<input type="text" name="first_name"><br/>
            LastName :<input type="text" name="last_name"><br/>
            <input type="submit" value="提交" />
        </form>
    </body>
</html>
        由于在servlet中没有处理请求的编码,获取的编码默认是ISO-8859-1,不支持汉字集。用拼音测试如下:

        首次访问:

        

        

        第二此访问:

        

       


2、Session

        session代表服务器与浏览器的一次会话过程,session有一个唯一标识的sessionID。

        当客户端第一次请求session对象时候,服务器会为客户端创建一个session,并将通过特殊算法算出一个session的ID,用来标识该session对象。

        当浏览器下次(session继续有效时)请求别的资源的时候,浏览器会将sessionID置于cookie中并放置到请求头,发送给服务器。

        服务器接收到请求后就得到该请求的sessionID,服务器找到该id的session返还给请求者(Servlet)使用。

        一个会话只能有一个session对象,session的唯一表示是sessionID。

        怎么使用Session?

        1)、创建或获取session对象

HttpSession session = request.getSession();

        2)、指定session会话最大间隔时间

session.setMaxInactiveInterval(2*60);
        3)、给session设置属性
session.setAttribute("first_name", first_name);
session.setAttribute("last_name", last_name);
        服务器响应时回自动把session的ID带回客户端,而session本身的数据是存放在服务端的。客户端下次访问时会将sessionID置于请求头中,服务器根据sessionID来识别session对象。 下面有一个session使用的例子:

package pers.zky.session.util;

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;

public class TestSession extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //获取输入的信息
        String first_name = request.getParameter("first_name");
        String last_name = request.getParameter("last_name");
        //获取session,没有session对象时自动创建
        HttpSession session = request.getSession();
        //指定session有效时间为2分钟
        session.setMaxInactiveInterval(2*60);
        //设置session对象的属性
        session.setAttribute("first_name", first_name);
        session.setAttribute("last_name", last_name);
        //重定向到session.jsp
        response.sendRedirect("session.jsp");
    }
}


<!-- 在web.xml中配置servlet -->
<servlet>
    <servlet-name>TestSession</servlet-name>
    <servlet-class>pers.zky.session.util.TestSession</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>TestSession</servlet-name>
    <url-pattern>/testSession</url-pattern>
</servlet-mapping>


<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!-- 首页index.jsp -->
<html>
    <head>
        <meta charset="utf-8">
        <title>TestSession</title>
    </head>
    <body>
        <form action="testSession" method="get">
            FirstName:<input type="text" name="first_name"><br/>
            LastName :<input type="text" name="last_name"><br/>
            <input type="submit" value="提交" />
        </form>
    </body>
</html>

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!-- 服务端响应给客户端的页面session.jsp -->
<html>
    <head>
        <meta charset="utf-8">
        <title>TestCookie</title>
    </head>
<body>
    <%
        String first_name = (String)session.getAttribute("first_name");
        String last_name = (String)session.getAttribute("last_name");
        out.println(first_name);
        out.println(last_name);
    %>
</body>
</html>
        为了测试方便,在这里session.jsp和index.jsp都是直接置于WebRoot下面的,可以通过浏览器地址栏直接访问。

        直接访问session.jsp,得到的处理结果是null  null:

        

        通过index.jsp填写信息后提交,服务器处理完请求后返回的时刚刚输入的信息:
        
        
        这时,多次刷新session.jsp或者在同一个浏览器的新窗口中打开session.jsp,均可以得到上面这张图片的结果。这是因为session设置的有效时间是2分钟,要是在间隔2分钟以后再刷新session.jsp,便会又得到null null。同时,sessionID也会变化,客户端会为新的会话分配一个新的ID。

        

        上面是使用谷歌浏览器进行访问的,在会话有效时间内,用其他的浏览器同时访问页面,这将产生一个新的会话。

        关闭浏览器后在打开页面,也会产生一个新的会话。


3、Cookie和Session的区别

        1)、session是在服务器端保存用户信息,cookie是在客户端保存用户信息。这样session就比cookie更加安全,但同时session也占用了服务器资源。

        2)、cookie通常用于保存不重要的用户信息,重要的信息使用session保存

        3)、session中保存的是对象,cookie保存的是字符串。

        4)、session随会话结束而关闭,cookie可以长期保存在客服端。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值