Servlet之ServletContext、Session、Cookie

ServletContext、Session、Cookie都可以用于存储数据,不过三者存储数据的位置及作用域不同。

由上图我们可以看出
ServletContext存储于服务端,每个客户端都可以访问到,数据共享。
Session存储于服务端,每个客户端有自己独立的数据区域。
Cookie存储于客户端。

下面通过代码来看一下三者的用法

package com.gujin.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.text.MessageFormat;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ContextServlet extends HttpServlet
{
   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse response)
         throws ServletException, IOException
   {
      ServletContext context = this.getServletConfig()
               .getServletContext();
      Integer count = (Integer) context.getAttribute("visit_count");
      if (count == null)
      {
         count = 1;
      }
      else
      {
         count++;
      }
      context.setAttribute("visit_count", count);
      // 设置响应内容类型
      response.setContentType("text/html;charset=UTF-8");

      PrintWriter writer = response.getWriter();
      // 想输出流写的内容就是客户端接收到的内容
      writer.print("<html>");
      writer.print("<head>");
      writer.print("<meta charset='UTF-8'>");
      writer.print("</head>");
      writer.print("<body>");
      writer.print(MessageFormat.format("<h1>访问次数:{0}</h1>", count));
      writer.print("</body>");
      writer.print("<html>");
      writer.flush();
      writer.close();
   }
}
package com.gujin.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.text.MessageFormat;

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 SessionServlet extends HttpServlet
{
   @Override
   protected void doGet(HttpServletRequest request, HttpServletResponse response)
         throws ServletException, IOException
   {
      String flag = request.getParameter("flag");
      HttpSession session = request.getSession();
      if ("login".equals(flag))
      {
         session.setAttribute("login", "login");
      }
      else if ("logout".equals(flag))
      {
         session.removeAttribute("login");
      }

      PrintWriter writer = response.getWriter();
      // 想输出流写的内容就是客户端接收到的内容
      writer.print("<html>");
      writer.print("<head>");
      writer.print("<meta charset='UTF-8'>");
      writer.print("</head>");
      writer.print("<body>");
      writer.print(MessageFormat.format("<h1>{0}</h1>",
            session.getAttribute("login") == null ? "未登录" : "已登录"));
      writer.print("</body>");
      writer.print("<html>");
      writer.flush();
      writer.close();
   }
}
package com.gujin.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.text.MessageFormat;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CookieServlet extends HttpServlet
{
   @Override
   protected void doGet(HttpServletRequest request, HttpServletResponse response)
         throws ServletException, IOException
   {
      // 设置响应内容类型
      response.setContentType("text/html;charset=UTF-8");
      PrintWriter writer = response.getWriter();
      // 想输出流写的内容就是客户端接收到的内容
      writer.print("<html>");
      writer.print("<head>");
      writer.print("<meta charset='UTF-8'>");
      writer.print("</head>");
      writer.print("<body>");
      writer.print("<ul>");

      // 获得所有Cookie
      Cookie[] cookies = request.getCookies();
      if (cookies != null)
      {
         for (Cookie cookie : cookies)
         {
            writer.print(MessageFormat.format("<li>{0}:{1}</li>",
                  cookie.getName(), cookie.getValue()));
         }
      }
      Cookie cookie = new Cookie("CookieServlet", System.currentTimeMillis() + "");
      //添加Cookie
      response.addCookie(cookie);
      writer.print("</ul>");
      writer.print("</body>");
      writer.print("<html>");
      writer.flush();
      writer.close();
   }
}

然后在web.xml中进行配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>Servlet</display-name>
  <servlet>
    <servlet-name>context</servlet-name>
    <servlet-class>com.gujin.servlet.ContextServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>context</servlet-name>
    <url-pattern>/context</url-pattern>
  </servlet-mapping>
  <servlet>
    <servlet-name>session</servlet-name>
    <servlet-class>com.gujin.servlet.SessionServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>session</servlet-name>
    <url-pattern>/session</url-pattern>
  </servlet-mapping>
  <servlet>
    <servlet-name>cookie</servlet-name>
    <servlet-class>com.gujin.servlet.CookieServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>cookie</servlet-name>
    <url-pattern>/cookie</url-pattern>
  </servlet-mapping>
</web-app>
时间: 2024-11-26 07:00:53

Servlet之ServletContext、Session、Cookie的相关文章

servlet redirect/forward/session/cookie 与 HTTP 协议的测试

 本文直接展示servlet的测试结果.   servlet的代码中使用sendRedirect:    public class SessionTest extends HttpServlet { protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ... response.sendRedire

javax.servlet.http.HttpSession session用法详解

javax.servlet.http.HttpSession session用法详解 HttpSession类它提供了setAttribute()和getAttribute()方法存储和检索对象. HttpSession提供了一个会话ID关键字,一个参与会话行为的客户端在同一会话的请求中存储 和返回它.servlet引擎查找适当的会话对象,并使之对当前请求可用.HttpServletRequest 接口提供了以下方法来获取HttpSession实例. public HttpSession get

巧解Session cookie

这方法,我自己想的,已经用了1,2年了,希望对有需要的网友有用. 所谓的 session cookie, 就是站台在你登录成功后送上一个 cookie,表示你已经通过验证,但与一般cookie不同的是,他并不会存在你的硬盘上,也就是说: 在你离开浏览器之后,就会消失,也就是意味:下次你重开浏览器,再进此站,此 cookie 已经不见了. 那么,要怎么让这个 cookie 永远有效呢?说永远太久了 我们就来个 50 年不变吧... set win=external.menuArguments s

巧妙破解Session cookie的方法

cookie|session|破解 这方法,我自己想的,已经用了1,2年了,希望对有需要的网友有用. 所谓的 session cookie, 就是站台在你登录成功后送上一个 cookie,表示你已经通过验证,但与一般cookie不同的是,他并不会存在你的硬盘上,也就是说: 在你离开浏览器之后,就会消失,也就是意味:下次你重开浏览器,再进此站,此 cookie 已经不见了. 那么,要怎么让这个 cookie 永远有效呢?说永远太久了 我们就来个 50 年不变吧... set win=externa

PHP创建和使用session cookie变量

<?php // session start session_start(); // 开始一个会话,如果要使用session程序最前面一定要加上这句 $_SESSION['user_id'] = '123′;//给一个session 变量赋值,如果该变量不存在即创建 echo $_SESSION['user_id'];//访问 session变量 $_SESSION = array();//清空所有session变量 session_destroy();//清除会话ID // session e

彻底杜绝PHP的session cookie错误

本文讨论的是如何彻底杜绝warning: Cannot add header information - headers already sent in...... 这种令人莫明其妙的的错误. 只要你写过PHP代码,相信都遇上过这个大多时候都令人莫明其妙的warning吧..今天我们就来搞定它............... 看了PHP手册,回答如下: 消息"Warning: Cannot send session cookie - headers already sent..."或者&

WCF常见问题(1) -- WebService/WCF Session Cookie

原文:WCF常见问题(1) -- WebService/WCF Session Cookie 在.net 3.0推出WCF之前使用的WebService,有的应用有使用Session保持一些信息,在不同的WebMethod中共享存储信息.比如:保持登陆用户的信息等.其原理是应用ASP.NET兼容模式,利用HttpContext来保持请求的上下文. 为了显示WebService/WCF不同应用下的Session/Cookie应用,这里分别创建两个Service应用:一个是WebService Ap

PHP 之session cookie

cookie和session有什么用?   常见的用法,比如在有些网站下载东西需要会员先登陆.http协议本身是无状态的,无法得知顾客是否已经登陆,怎么办呢?cookie和session就可以知道.再比如网上购物,用户身份认证,程序状态记录.购物车怎么知道顾客挑选过哪些商品呢?cookie和session也可以记录.总而言之,cookie和session就是能够记录顾客状态的技术,尽管二者属于不同的技术,但只要cookie能做到的,session也能做到!如果session和cookie一样安全

php页面跳转session cookie丢失导致不能登录等问题的解决方法_php实例

thinkphp开发的一个项目,登录成功后又跳转到登录页面,在提交信息后输出session都是正常的,没有问题,但是页面跳转后,session出现丢失现象,无法正常完成登陆. 通过查找资料,发现原来是bom头的原因.受COOKIE送出机制的限制,在这些文件开头已经有BOM的文件中,COOKIE无法送出(因为在COOKIE送出前PHP已经送出了文件头),所以登入和登出功能失效.一切依赖COOKIE.SESSION实现的功能全部无效. 正确的处理方法是去掉某些文件的bom,一般情况是在入口文件出现的