Servlet 之会话cookie与session

  简单地说,用户打开浏览器,发送多次请求并接受到来自服务器的响应,而后关闭浏览器,整个过程称之为一次会话。在多次请求中,为了共享数据,浏览器端采用cookie技术来保存与使用数据,而服务器端则是session技术(相对于一次会话的多次请求)。cookie技术不局限java,其他语言也支持。例如:php、javascript等。Javaweb中提供了javax.servlet.http.Cookie类提供了相关操作,对于服务器端的程序而言,使用cookie相关的api,只需要关注几个点:

  怎么创建cookie,如何将cookie发送给浏览器,接收到请求时又如何取得其中的cookie。这里创建一个servlet,在doGet方法中实现,获取请求的cookie,如果有,将其删除;如果没有,创建cookie:

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");

        Cookie[] cookies = request.getCookies();
        if (null != cookies) {
            for (int i = 0; i < cookies.length; i++) {
                System.out.println("取得cookie: "+cookies[i].getName() + " " + cookies[i].getValue());
                cookies[i].setPath("/");
                cookies[i].setMaxAge(0);
                response.addCookie(cookies[i]);
            }
        } else {
            System.out.println("没有cookie");
            Cookie resCookie = new Cookie("testCookie", "testCookieValue");
            resCookie.setMaxAge(60 * 60 * 24);
            resCookie.setPath("/");
            response.addCookie(resCookie);
        }
        PrintWriter pw = response.getWriter();
        pw.write("中文字符");
    }

代码部署好之后,重复地请求该servlet,会出现如下效果(IE, Firefox, Chrome)

没有cookie
取得cookie: testCookie testCookieValue
没有cookie
取得cookie: testCookie testCookieValue
没有cookie

  这段代码已经举例给出了如何创建cookie,如何获取cookie(注意要做非空判断)以及如何在响应中加入cookie。cookie的默认路径(一般设置resCookie.setPath("/");以此保证tomcat下可以共享相同的cookie),另外,设置cookie的有效时间,参数单位为‘秒’,想要删除该cookie,可将其时间设置为0。

  cookie的消息内容是放置在http的请求头和响应头里的,所以不支持中文:

Cookie resCookie = new Cookie("testCookie", "中文库克益");
resCookie.setMaxAge(60 * 60 * 24);
resCookie.setPath("/");
response.addCookie(resCookie);

====>

java.lang.IllegalArgumentException: Control character in cookie value or attribute.

如果需要放入中文,就需要用到JDK提供的编码和解码工具: URLEncoder,URLDecoder:

@SuppressWarnings("deprecation")
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // TODO Auto-generated method stub
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");

        Cookie[] cookies = request.getCookies();
        if (null != cookies) {
            for (int i = 0; i < cookies.length; i++) {
                System.out.println("取得cookie: "+cookies[i].getName() + " " + cookies[i].getValue());
                System.out.println(URLDecoder.decode(cookies[i].getValue()));
                cookies[i].setPath("/");
                cookies[i].setMaxAge(0);
                response.addCookie(cookies[i]);
            }
        } else {
            System.out.println("没有cookie");
            String cookieMsg = URLEncoder.encode("中文库克益");
            Cookie resCookie = new Cookie("testCookie", cookieMsg);
            resCookie.setMaxAge(60 * 60 * 24);
            resCookie.setPath("/");
            response.addCookie(resCookie);
        }
        PrintWriter pw = response.getWriter();
        pw.write("中文字符");
    }

-------------------------------------------------------------------------------->

  写过用户登录的话,一定会对session不会陌生。JavaEE规范提供接口:javax.servlet.http.HttpSession 用于描述session对象,它是一次会话中,对共享数据进行管理的服务器端技术。

  获取一个session:

    request.getSession()  获得session,如果没有将创建一个新的。等效request.getSession(true);

    request.getSession(boolean) 获得session,true:没有将创建,false:没有将返回null.

  也可以进行属性相关的操作:session.xxxAttribute().

  基于cookie,也就是说,如果浏览器禁用cookie,那么默认情况下,session将会失效。这里用一副图来说明session与cookie的关系:

  当第一次调用 request.getSession() ,tomcat将创建一个session对象,并将session对象id值,以cookie方式发送给浏览器,之后浏览器再次请求时,将session id 发送服务器,服务器通过request.getSession() 就可以获取之前已经创建好的session对象。如果此时浏览器禁用cookie,那么在返回的请求中就不会包含cookie,服务器找不到JSESSIONID,无法获取到先前的session内容,于是会重新创建一个session id。

  对于一个session,它的创建就是从第一次调用request.getSession()时创建。而它的消亡,除了服务器非正常关闭(正常关闭时持久化,写入到文件中),可能是超时--可以在web.xml中设置它的最大时限(单位:分钟):

  ...
  <session-config>
      <session-timeout>30</session-timeout>
  </session-config>
</web-app>

另外,可以调用api,将其销毁:

  invalidate() 将session对象销毁了。

  setMaxInactiveInterval(int interval) 设置有效时间,单位秒

  那么,如果浏览器真的禁用了cookie,我们怎么将session id传递给服务器呢?

    通过URL将session id 传递给服务器:URL重写

  手动方式: url;jsessionid=....

  api方式:

   encodeURL(java.lang.String url) 进行所有URL重写

  encodeRedirectURL(java.lang.String url) 进行重定向 URL重写

  如果参数url为空字符不同,其他都一样。

  如果浏览器禁用cooke,api将自动追加session id ,如果没有禁用,api将不进行任何修改。

  注意:如果浏览器禁用cookie,web项目的所有url都需手动重写。否则session将不能正常工作。

时间: 2024-12-05 10:47:18

Servlet 之会话cookie与session的相关文章

会话Cookie及session的关系(Cookie &amp; Session)

会话Cookie及session的关系(Cookie & Session) 在通常的使用中,我们只知道session信息是存放在服务器端,而cookie是存放在客户端.但服务器如何使用session和客户端之间进行通信,以及jsessionId是怎么回事,这并没有一个完整和正确的认识,因此这里将这类信息汇总. session中的jsessionId是在session创建好之后,发送给客户端.然后在每一次请求中,客户端即会将这个信息传递给服务器端,服务器端使用这个信息来维护和客户端之间的会话通信,

会话 Cookie 和Session

1.Cookie  第一次发送请求显示"还没有数据...." public class CookieDemo extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //创建cookie 对象 Cookie cookie = new Cookie

Servlet中的cookie和session

保存数据的2中方式 Cookie Session Cookie 我们可以将一些信息保存到cookie中,cookie存放在对应的浏览器目录里面.每个站点可以保存20个cookie,最大长度不超过4k.同时,由于http协议是明文传输,所以使用cookie的时候存在一些安全性问题. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException

cookie与Session的区别,以及jQuery怎样操作cookie和Session

cookie与Session的区别 Cookie,有时也用其复数形式Cookies,指某些网站为了辨别用户身份.进行session跟踪而储存在用户本地终端上的数据(通常经过加密).Session是指一个终端用户与交互系统进行通信的时间间隔,通常指从注册进入系统到注销退出系统之间所经过的时间.以及如果需要的话,可能还有一定的操作空间. jQuery怎样操作cookie 一个轻量级的cookie 插件,可以读取.写入.删除 cookie. jquery.cookie.js 的配置 首先包含jQuer

Cookie 和Session区别

会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话. Cookie Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器.当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去.这样,web资源处理的就是用户各自的数据了. HttpSession Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的HttpSession对象,由于sess

深入浅出,解析cookie与session

一.session和cookie的特征 很多人认为,session是服务端的,cookie是客户端的.其实呢,session和cookie都是服务器产生的,都是键值对应的. ** session是保存在服务器的,服务器会生成对应的session文件,cookie是返回给客户端的,然后客户端在存储相关文件.** session在服务器的入口是ID,然后服务器查出对应的的值,通过类似cookie的形式,返回给客户端(相当于买电影票).客户端(浏览器),会在发送请求的时候,自动将本地存活的cookie

会话控制cookie和session

Cookie Cookie简介 HTTP是无状态协议,服务器不能记录浏览器的访问状态,也就是说服务器不能区分中两次请求是否由一个客户端发出.这样的设计严重阻碍的Web程序的设计.如:在我们进行网购时,买了一条裤子,又买了一个手机.由于http协议是无状态的,如果不通过其他手段,服务器是不能知道用户到底买了什么.而Cookie就是解决方案之一. Cookie实际上就是服务器保存在浏览器上的一段信息.浏览器有了Cookie之后,每次向服务器发送请求时都会同时将该信息发送给服务器,服务器收到请求后,就

JAVAWEB开发之JSP、EL、及会话技术(Cookie和Session)的使用详解

Servlet的缺点 开发人员要十分熟悉JAVA 不利于页面调试和维护(修改,重新编译) 很难利用网页设计工具进行页面设计(HTML内容导入到servlet中,用PrintWriter的对象进行输出) JSP简介 JSP(Java Server Pages) 与Java Servlet一样,是在服务器端执行的,不同的是JSP先由服务器编译部署成Servlet执行. JSP技术的企业最佳实践(生成HTML内容) 新的JSP2.0规范版本包括新的功能(EL表达式,新增的Simple Tag和Tag

会话跟踪技术--cookie和session 小结

学习过servlet的都知道,servlet是单例多线访问的,所以我们不能设置servlet成员变量来存放浏览器的访问数据.怎么解决浏览器的访问数据,让不同访问者能够访问到自己的数据呢? 相信学习完了cookie和session技术之后,读者会明白这个问题. 我们在浏览器上使用http协议在网络上传输数据的时候,服务器对于http的状态处理有两个方式,cookie和session. 笔者对于cookie设session的理解是这样的:当我们想要记录浏览器与服务器之间的交互的时候,通常的方法就是