会话跟踪
HTTP是“无状态”协议:客户程序每次读取Web页面,都打开到web服务器的单独的连接,而且,服务器也不自动维护客户的上下文信息。类似客户决定结账时,如何确定之前创建的购物车中哪个属于此客户呢?这种问题有三种解决方案:
cookie、URL重写和隐藏的表单域
cookie处理:
cookie存储购物会话的ID;在后续;连接中,取出当前的会话ID,并使用这个ID从服务器的查找表上提取会话的相关信息。用到两个表:将会话ID与用户关联起来的表和存储用户具体数据的表。
String sessionID = makeUniqueString();
HashMap sessionInfo = new HashMap();
HashMap globalTable = findTableStoringSessions();
globalTable.put(sessionID, sessionInfo);
Cookie sessionCookie = new Cookie("JSESSION", sessionID);
sessionCookie.setPath("/");
response.addCookie(sessionCookie);
这种方式使用cookie是一种绝佳的解决方案,是处理会话常用的方式

url重写:
采用这种方式,客户程序在每个URL尾部加上一些额外数据。这些数据标识当前的会话,服务器将这个标识与它存储的用户相关数据关联起来
隐藏的表单域:
主要缺点是:仅当每个页面都是由表单提交而动态生成才能适用这种方法。

servlet中的会话跟这陪你过
servlet提供一种出色的会话跟踪解决方案:HttpSession API.这个高层接口构筑在cookie和url重写之上
会话跟踪基础:
1、访问与当前请求关联的会话对象
request.getSession获取HttpSession对象。是一个简单的散列表
2、查找与会话相关联的信息
HttpSession的getAttribute
3、存储会话中的信息
setAttribute
4、废弃会话数据
removeAttribute废弃指定的值。invalidate废弃整个会话。logout使客户推出web服务器并作废与用户相关联的所有会话

浏览器会话与服务器会话:
默认,会话跟踪基于存储在浏览器内存中的cookie。

URL重写的话对发往客户的url进行编码:
第一种情况是servlet生成的web页面中含有嵌入的URL。在这种情况下,应该将URL传递给HttpResponse的encodeURL方法。这个方法确定当前是否在使用URL重写,仅在必需时附加会话信息;否则,不做任何更改直接返回传入的URL:
String originalURL = someRelativeOrAbsoluteURL;
String encodeURL = response.encodeURL(originalURL);
out.println("a href=\"" + encodeURL + "\">...</A>")
第二种情况是在sendRedirect调用。这种情况下由于要根据不同的规则确定是否附加会话信息,因此不能使用encodeURL。幸运的是,HttpServletResponse提供encodeRedirectURL方法来处理这种情况:
String originURL = someURL;
String encodedURL = response.encodeRedirectURL(originalURL);
response.sendRedirect(encodedURL);

session:实现购物车的例子:

package com.zhen.test.o5;

import com.zhen.domain.Catalog;
import com.zhen.domain.CatalogItem;
import com.zhen.util.ServletUtilities; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter; /**
* Created by zhen on 2017-11-15.
*/
public class CatalogPage extends HttpServlet {
private CatalogItem[] items;
private String[] itemIDs;
private String title; protected void setItems(String[] itemIDs) {
this.itemIDs = itemIDs;
items = new CatalogItem[itemIDs.length];
for(int i=0; i<items.length; i++){
items[i] = Catalog.getItem(itemIDs[i]);
}
} protected void setTitle(String title) {
this.title = title;
} @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
if(items == null){
resp.sendError(HttpServletResponse.SC_NOT_FOUND, "Missing Items.");
return;
}
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
out.println(ServletUtilities.headWithTitle(title) + "" +
"<body bgcolor=\"#fdf5e6\">" + title + "</h1>");
CatalogItem item;
for(int i=0; i<items.length; i++){
out.println("<hr>");
item = items[i];
if(item == null){
out.println("<font color=\"red\">Unknow item ID " + itemIDs[i] + "</font>");
}else{
out.println();
String formURL = "com.zhen.test.o5.OrderPage";
formURL = resp.encodeURL(formURL);
out.println("<form action=\"" + formURL + "\">" +
"<input type=\"hidden\" name=\"itemID\" value=\"" +item.getItemID()+ "\">\n" +
"<h2>" + item.getShortDescription() + " ($" + item.getCost() + ")</h2>\n" +
item.getLongDescription() + "\n" +
"<br>" +
"<input type=\"submit\" value=\"Add to Shopping Cart\">\n" +
"</form>");
}
}
out.println("</body></html>");
}
} package com.zhen.test.o5; import com.zhen.test.o5.CatalogPage; /**
* Created by zhen on 2017-11-15.
*/
public class KidsBooksPage extends CatalogPage{
public void init(){
String[] ids = {"lewis001", "alexander001", "rowling001"};
setItems(ids);
setTitle("All-Time Best Children's Fantasy Books");
}
} package com.zhen.test.o5; import com.zhen.domain.ItemOrder;
import com.zhen.domain.ShoppingCart;
import com.zhen.util.ServletUtilities; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.NumberFormat;
import java.util.List; /**
* Created by zhen on 2017-11-15.
*/
public class OrderPage extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
ShoppingCart cart;
synchronized (session) {
cart = (ShoppingCart) session.getAttribute("shoppingCart");
if(cart == null){
cart = new ShoppingCart();
session.setAttribute("shoppingCart", cart);
}
String itemID = req.getParameter("itemID");
if(itemID != null){
String numItemString = req.getParameter("numItems");
if(numItemString == null){
cart.addItem(itemID);
}else{
int numItems;
try{
numItems = Integer.parseInt(numItemString);
}catch (NumberFormatException nef){
numItems = 1;
}
cart.setNumOrdered(itemID, numItems);
}
}
}
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
String title = "Status of your Order";
out.println(ServletUtilities.headWithTitle(title) + "" +
"<body bgcolor=\"#fdf5e6\">\n" +
"<h1 align=\"center\">" + title + "</h1>");
synchronized (session){
List itemsOrdered = cart.getItemsOrdered();
if(itemsOrdered.size() == 0){
out.println("<h2><I>No items in your cart...</I></h2");
}else{
out.println("<table border=1 align=\"center\">" +
"<tr bgcolor=\"#ffad00\">" +
" <th>Item ID</th>" +
" <th>Description</th>" +
" <th>Unit Cost</th>" +
" <th>Number</th>" +
" <th>Total Cost</th>" +
"</tr>");
ItemOrder order;
NumberFormat format = NumberFormat.getCurrencyInstance();
for(int i=0; i<itemsOrdered.size(); i++){
order = (ItemOrder) itemsOrdered.get(i);
out.println("<tr>" +
" <td>" + order.getItemID() + "</td>" +
" <td>" + order.getShortItemDescription() + "</td>" +
" <td>" + format.format(order.getUnitCost()) + "</td>" +
" <td>" +
"<form>" +
" <input type=\"hidden\" name=\"itemID\" value=\"" + order.getItemID() + "\"/>\n" +
" <input type=\"text\" name=\"numItems\" size=3 value=\"" + order.getNumItems() + "\"/>\n" +
" <small><input type=\"submit\" value=\"Update Order\"/></small>" +
"</form>" +
" </td>" +
" <td>" + format.format(order.getTotalCost()) + "</td>" +
"</tr>");
}
String checkoutURL = resp.encodeURL("/webApp1/html/Checkout.html");
out.println("</table>" +
"<form action=\"" + checkoutURL + "\">" +
"<big><center>" +
"<input type=\"submit\" value=\"Proceed to Checkout\">" +
"</center></big></form>");
}
out.println("</body></html>");
}
}
} package com.zhen.test.o5; /**
* Created by zhen on 2017-11-15.
*/
public class TeachBooksPage extends CatalogPage {
public void init() {
String[] ids = {"hall001", "hall002"};
setItems(ids);
setTitle("All-Time Best Computer Books");
}
} package com.zhen.domain; /**
* @author zhen
* Created by zhen on 2017-10-30.
*/
public class BidInfo {
private String itemID = "";
private String itemName = "";
private String bidderName = "";
private String emailAddress = "";
private double bidPrice = 0;
private boolean autoIncrement = false; public String getItemID() {
return itemID;
} public void setItemID(String itemID) {
this.itemID = itemID;
} public String getItemName() {
return itemName;
} public void setItemName(String itemName) {
this.itemName = itemName;
} public String getBidderName() {
return bidderName;
} public void setBidderName(String bidderName) {
this.bidderName = bidderName;
} public String getEmailAddress() {
return emailAddress;
} public void setEmailAddress(String emailAddress) {
this.emailAddress = emailAddress;
} public double getBidPrice() {
return bidPrice;
} public void setBidPrice(double bidPrice) {
this.bidPrice = bidPrice;
} public boolean isAutoIncrement() {
return autoIncrement;
} public void setAutoIncrement(boolean autoIncrement) {
this.autoIncrement = autoIncrement;
} public boolean isComplete() {
return hasValue(getItemID()) &&
hasValue(getItemName()) &&
hasValue(getBidderName()) &&
hasValue(getEmailAddress()) &&
(getBidPrice() > 0);
} public boolean isPartlyComplete(){
boolean flag = (hasValue(getItemID())) ||
hasValue(getItemName()) ||
hasValue(getBidderName()) ||
hasValue(getEmailAddress()) ||
(getBidPrice() > 0) ||
isAutoIncrement();
return flag;
} private boolean hasValue(String val) {
return (val != null) && (!val.equals(""));
} } package com.zhen.domain; /**
* Created by zhen on 2017-11-15.
*/
public class Catalog {
private static CatalogItem[] items = {
new CatalogItem("hall001",
"<I>Core servlets and JavaServer Pages 2nd Edition<I>",
"by Marty Hall and Larry Brown", 39.95),
new CatalogItem("hall002",
"<I>Core web programming , 2nd Edition<I>",
"by Marty Hall and Larry Brown",
49.99),
new CatalogItem("lewis001",
"<I>The Chronicles of Narina<I>",
"ny C.S Lewis",
19.95),
new CatalogItem("alexander001",
"<I>The Prydain Series<I>",
"by Lloyed Alexander",19.95),
new CatalogItem("rowling001",
"The Harry Potter Series",
"by J.K. Rowling",59.95)
}; public static CatalogItem getItem(String itemID){
CatalogItem item;
if(itemID == null){
return null;
}
for(int i=0; i<items.length; i++){
item = items[i];
if(itemID.equals(item.getItemID())){
return item;
}
}
return null;
}
} package com.zhen.domain; /**
* Created by zhen on 2017-11-15.
*/
public class CatalogItem {
private String itemID;
private String shortDescription;
private String longDescription;
private double cost; public String getItemID() {
return itemID;
} public void setItemID(String itemID) {
this.itemID = itemID;
} public String getShortDescription() {
return shortDescription;
} public void setShortDescription(String shortDescription) {
this.shortDescription = shortDescription;
} public String getLongDescription() {
return longDescription;
} public void setLongDescription(String longDescription) {
this.longDescription = longDescription;
} public double getCost() {
return cost;
} public void setCost(double cost) {
this.cost = cost;
} public CatalogItem(String itemID, String shortDescription, String longDescription, double cost) {
this.itemID = itemID;
this.shortDescription = shortDescription;
this.longDescription = longDescription;
this.cost = cost;
}
} package com.zhen.domain; /**
* Created by zhen on 2017-11-15.
*/
public class ItemOrder {
private CatalogItem item;
private int numItems; public CatalogItem getItem() {
return item;
} public void setItem(CatalogItem item) {
this.item = item;
} public int getNumItems() {
return numItems;
} public void setNumItems(int numItems) {
this.numItems = numItems;
} public ItemOrder(CatalogItem item, int numItems) {
this.item = item;
this.numItems = numItems;
} public ItemOrder(CatalogItem item) {
this.item = item;
this.numItems = 1;
} public String getItemID(){
return getItem().getItemID();
} public String getShortItemDescription(){
return getItem().getShortDescription();
} public String getLongItemDescription(){
return getItem().getLongDescription();
} public double getUnitCost(){
return getItem().getCost();
} public void incrementNumItems(){
setNumItems(getNumItems() + 1);
} public void cancelOrder(){
setNumItems(0);
} public double getTotalCost() {
return getNumItems() * getUnitCost();
}
} package com.zhen.domain; import java.util.ArrayList;
import java.util.List; /**
* Created by zhen on 2017-11-15.
*/
public class ShoppingCart {
private ArrayList itemsOrdered; public ShoppingCart(){
itemsOrdered = new ArrayList();
} public List getItemsOrdered(){
return itemsOrdered;
} public synchronized void addItem(String itemID) {
ItemOrder order;
for(int i=0; i<itemsOrdered.size(); i++){
order = (ItemOrder) itemsOrdered.get(i);
if(order.getItemID().equals(itemID)){
order.incrementNumItems();
return;
}
}
ItemOrder newOrder = new ItemOrder(Catalog.getItem(itemID));
itemsOrdered.add(newOrder);
} public synchronized void setNumOrdered(String itemID, int numOrdered) {
ItemOrder order;
for(int i=0; i<itemsOrdered.size(); i++){
order = (ItemOrder) itemsOrdered.get(i);
if(order.getItemID().equals(itemID)){
if(numOrdered <= 0){
itemsOrdered.remove(i);
}else{
order.setNumItems(numOrdered);
}
return;
}
}
ItemOrder newOrder = new ItemOrder(Catalog.getItem(itemID));
itemsOrdered.add(newOrder);
}
} <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Checking Out</title>
</head>
<body bgcolor="#FDF5E6">
<h1 align="center">Checking Out</h1>
We are sorry, but our electronic credit-card-processing system is currently out of order. Please send a check to:
<pre>
Marty Hall
coreservlets.com, Inc.
6 Meadowsweet Ct., Suite B1
Reisterstown, MD 21136-6020
410-429-5535
hall@coreservlets.com
</pre>
Since we have not yet calculated shipping charges, please sign the check but not fill in the amount. We will generously do that for you.
</body>
</html>

  

会话跟踪session的更多相关文章

  1. 会话跟踪session cookie

    会话跟踪 会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在 ...

  2. IT兄弟连 JavaWeb教程 Servlet会话跟踪 Session常用方法

    ●  public Object getAttribute(String name) 该方法返回在该session会话中具有指定名称的对象,如果没有指定名称的对象,则返回null. ●  public ...

  3. IT兄弟连 JavaWeb教程 Servlet会话跟踪 Session技术

    Servlet提供了HttpSession接口,该接口提供了一种跨多个页面请求或访问网站时识别用户以及存储有关用户信息的方式. Servlet容器使用这个接口来创建一个HTTP客户端和HTTP服务器之 ...

  4. IT兄弟连 JavaWeb教程 Servlet会话跟踪 Session优缺点

    ●  数据存储在服务器,安全. ●  session能保存Object类型数据,也就是说能存储任意数据. ●  可存储的数据大小,理论上是无限制的. ●  因为数据存储在服务器端,当用户比较多时,会占 ...

  5. 2018.8.18 servlet使用的会话跟踪除session外还有哪些方式

    解释HTTP HTTP是一种无连接的协议,如果一个客户端只是单纯地请求一个文件(HTML或GIF),服务器端可以响应给客户端,并不需要知道一连串的请求是否来自于相同的客户端,而且也不需要担心客户端是否 ...

  6. 会话跟踪Cookie与Session

    会话跟踪用来跟踪用户的整个会话,常用的是Session和Cookie.Cookie通过客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份. 1.Cookie  1.1概念及使 ...

  7. {Django基础八之cookie和session}一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session

    Django基础八之cookie和session 本节目录 一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session 六 xxx 七 ...

  8. Cookie&Session会话跟踪技术

    今日内容学习目标 可以响应给浏览器Cookie信息[response.addCookie()] 可以接受浏览器Cookie信息[request.getCookies()] [创建cookie,设置pa ...

  9. cookie和session的区别与会话跟踪技术

    会话跟踪技术: HTTP是一种无状态协议,每当用户发出请求时,服务器就会做出响应,客户端与服务器之间的联系是离散的.非连续的.当用户在同一网站的多个页面之间转换时,根本无法确定是否是同一个客户,会话跟 ...

随机推荐

  1. [SpringBoot] - 发送带附件的邮件

    <!--发送email依赖--> <dependency> <groupId>org.springframework.boot</groupId> &l ...

  2. shiro的简单入门使用

    这里只是测试登录认证,没有web模块,没有连接数据库,用户密码放在shiro.ini配置中,密码没有加密处理,简单入门. 基于maven 先看目录结构 测试结果 pom.xml <?xml ve ...

  3. js函数事件对象

    每个函数都有4个默认对象 arguments 保存着实际传入的参数,集合列表 return 有两个功能,打断函数和返回函数值 this 谁调用的函数,this就是谁 event 事件对象 事件 box ...

  4. HDU 5873 Football Games(竞赛图兰道定理)

    http://acm.hdu.edu.cn/showproblem.php?pid=5873 题意: 现在有比赛,所有队伍两两进行比赛,赢的积2分,输的积0分,如果平局的话就各自都积1分,现在给出每只 ...

  5. shell 判断字符串是否为空

    #!/bin/bash a="" if [ -n "$a" ] then echo "-n $a : 字符串长度不为 0" else ech ...

  6. MongoDB(课时15 数据排序)

    3.4.2.10 数据排序 在MongoDB里数据排序操作使用“sort()”函数,在进行排序的时候可以有两个顺序:升序(1),降序(-1). 范例:排序 db.students.find().sor ...

  7. Flutter学习笔记(四)--Flutter几个小知识点

    Flutter的Widget采用的是现代化的React风格,该风格的设计灵感来源于React这么语言.最核心的理念是你可以使用Widget设计界面.Widget通过当前的state和注册信息来描述vi ...

  8. img srcset 和 sizes

    img srcset 和 sizes 诞生的目的是解决图片清晰度和节省加载图片大小问题,比方说我需要在retina高的硬件上看到更细腻的图片,又或者我要在电脑看到的图片和在手机上的图片不一样.   解 ...

  9. scss 覆盖 原有变量

    在scss的variables.scss 中会有很多的变量 $color: red !default; $body-color: $color !default; 这些!default 和我们理解的! ...

  10. Lua面向对象 --- 多态

    多态,简单的理解就是事物的多种形态.专业的术语说就是:同一个实现接口,使用不同的实例而执行不同的操作. 工程结构: BaseRoom.lua: BaseRoom = {} function BaseR ...