什么是会话:用户打开浏览器,点击多个超链接,访问服务器的多个web资源,然后关闭浏览器,整个过程就称为一个会话;

会话过程需要解决的问题:每个用户在使用浏览器与服务器进行会话的过程中,都可能会产生一些数据,这些输入如何来进行保存?比如用户在购物网站浏览的商品记录,用户添加购物车的记录等等这些信息如何进行存储?在程序中会话跟踪是一件非常重要的事情,一个用户的所有请求操作都应该属于同一个会话,而另一个人的所有请求操作应该属于另一个人,二者不能混淆!当想到需要在保存数据时,我们首先肯定会想到使用域对象,这些数据是否可以使用Request或者ServletContext对象来保存呢?

首先我们举例说明:登录的场景

1 Context对象:

小张: 输入“张三” (保存数据: context.setAttribute("name","张三")) -> 用户主页(显示“张三”)

小李: 输入“李四”(保存数据:context.setAttribute("name","李四")) ->   用户主页(显示“李四”)

context是所有用户公有的资源,因此当小李登录后,用户主页将全部显示为“李四”,新的数据将会覆盖原有的数据,因此不能够使用context对象;

2 Request对象:该对象只在同一个页面有效,当需要进行页面跳转的时候,显然必须使用转发技术来实现,因此Request对象也不能够有效解决该问题。

会话技术

为了解决上述的问题,这里引入了会话技术,其中会话技术主要分为两个部分,cookie技术和session技术,前者将数据保存在客户端,后者将数据保存在服务器。

  • Cookie技术:Cookie是客户端技术,服务器把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。
  • Session技术:Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。

(一) Cookie技术

1.1 Cookie技术核心

Cookie类:用于存储会话数据

1)构造Cookie对象

  • Cookie(java.lang.String name, java.lang.String value)

2)设置cookie

  • void setPath(java.lang.String uri)   :设置cookie的有效访问路径
  • void setMaxAge(int expiry) : 设置cookie的有效时间
  • void setValue(java.lang.String newValue) :设置cookie的值

3)发送cookie到浏览器端保存

  • void response.addCookie(Cookie cookie)  : 发送cookie

4)服务器接收cookie:

  • Cookie[] request.getCookies()  : 接收cookie,返回所有cookie的数据信息

1.2 Cookie原理

1)服务器创建cookie对象,把会话数据存储到cookie对象中。

  • new Cookie("name","value");

2)服务器发送cookie信息到浏览器

  • response.addCookie(cookie);

举例: set-cookie: name=Infaraway ( 隐藏发送了一个set-cookie名称的响应头 )

3)浏览器得到服务器发送的cookie,然后保存在浏览器端。

4)浏览器在下次访问服务器时,会带着cookie信息

举例: cookie: name=Infaraway (隐藏带着一个叫cookie名称的请求头)

5)服务器接收到浏览器带来的cookie信息

  • request.getCookies();
 package com.infaraway.servlet;

 import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException; /**
* Created by :Infaraway
* DATE : 2017/3/25
* Time : 22:08
* Funtion : cookie测试
*/
public class CreateCookie {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1.创建Cookie对象
Cookie cookie1 = new Cookie("name","Infaraway");
//Cookie cookie2 = new Cookie("email","Infaraway@qq.com");
//Cookie cookie1 = new Cookie("email","Infaraway@qq.com"); /**
* 1)设置cookie的有效路径。默认情况:有效路径在当前web应用下。 /cookie
*/
//cookie1.setPath("/cookie");
//cookie2.setPath("/basisJavaWeb");
/**
* 2)设置cookie的有效时间
* 正整数:表示cookie数据保存浏览器的缓存目录(硬盘中),数值表示保存的时间。
* 负整数:表示cookie数据保存浏览器的内存中。浏览器关闭cookie就丢失了!
* 零:表示删除同名的cookie数据
*/
//cookie1.setMaxAge(20); //20秒,从最后不调用cookie开始计算
cookie1.setMaxAge(-1); //cookie保存在浏览器内存(会话cookie)
//cookie1.setMaxAge(0); //2.把cookie数据发送到浏览器(通过响应头发送: set-cookie名称)
//response.setHeader("set-cookie", cookie.getName()+"="+cookie.getValue()+",email=eric@qq.com");
//推荐使用这种方法,避免手动发送cookie信息
response.addCookie(cookie1);
//response.addCookie(cookie2);
//response.addCookie(cookie1); //3.接收浏览器发送的cookie信息
/*String name = request.getHeader("cookie");
System.out.println(name);*/
Cookie[] cookies = request.getCookies();
//注意:判断null,否则空指针
if(cookies!=null){
//遍历
for(Cookie c:cookies){
String name = c.getName();
String value = c.getValue();
System.out.println(name+"="+value);
}
}else{
System.out.println("没有接收cookie数据");
}
}
}

1.3 Cookie的细节

1)void setPath(java.lang.String uri)   :设置cookie的有效访问路径。有效路径指的是cookie的有效路径保存在哪里,那么浏览器在有效路径下访问服务器时就会带着cookie信息,否则不带cookie信息。

2)void setMaxAge(int expiry) : 设置cookie的有效时间。

  • 正整数:表示cookie数据保存浏览器的缓存目录(硬盘中),数值表示保存的时间。
  • 负整数:表示cookie数据保存浏览器的内存中。浏览器关闭cookie就丢失了!!
  • 零:表示删除同名的cookie数据

3)Cookie数据类型只能保存非中文字符串类型的。可以保存多个cookie,但是浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。

1.4  案例-查看用户浏览器过的商品

首先是商品的实体类:

 package com.infaraway.entity;

 /**
* Created by :Infaraway
* DATE : 2017/3/25
* Time : 14:34
* Funtion : 商品类
*/
public class Product { private String id;
private String proName;
private String proType;
private double price;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getProName() {
return proName;
}
public void setProName(String proName) {
this.proName = proName;
}
public String getProType() {
return proType;
}
public void setProType(String proType) {
this.proType = proType;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public Product(String id, String proName, String proType, double price) {
super();
this.id = id;
this.proName = proName;
this.proType = proType;
this.price = price;
}
public Product() {
super();
// TODO Auto-generated constructor stub
}
@Override
public String toString() {
return "Product [id=" + id + ", price=" + price + ", proName="
+ proName + ", proType=" + proType + "]";
} }

这里我们使用list集合来模拟数据库,使用dao层进行增删改查操作

 package com.infaraway.dao;

 import com.infaraway.entity.Product;

 import java.util.ArrayList;
import java.util.List; /**
* Created by :Infaraway
* DATE : 2017/3/25
* Time : 14:34
* Funtion : 商品的增删改查操作
*/
public class ProductDao {
//模拟数据库,存储所有的商品信息
private static List<Product> data = new ArrayList<Product>(); /**
* 静态代码块,初始化
*/
static{
//初始化
for(int i=1;i<=10;i++){
data.add(new Product(""+i,"笔记本"+i,"LN00"+i,334.0+i));
}
} /**
* 显示所有的商品
*/
public List<Product> findAll(){
return data;
} /**
* 根据id查找商品
*/
public Product findById(String id){
for(Product p:data){
if(p.getId().equals(id)){
return p;
}
}
return null;
} }

然后给出商品列表界面,由用户点击选择浏览的商品,并且给出了用户的浏览记录

 package com.infaraway.servlet;

 import com.infaraway.dao.ProductDao;
import com.infaraway.entity.Product; import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List; /**
* Created by :Infaraway
* DATE : 2017/3/25
* Time : 14:34
* Funtion :
*/
public class ListServlet extends HttpServlet {
@Override
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html;charset=utf-8");
ProductDao dao = new ProductDao();
List<Product> productList = dao.findAll(); //2.把商品显示到浏览器
PrintWriter writer = resp.getWriter();
String html = ""; html += "<html>";
html += "<head>";
html += "<title>显示商品列表</title>";
html += "</head>";
html += "<body>";
html += "<table border='1' align='center' width='600px'>";
html += "<tr>";
html += "<th>编号</th><th>商品名称</th><th>商品型号</th><th>商品价格</th>";
html += "</tr>";
//遍历商品
if(productList!=null){
for(Product p:productList){
html += "<tr>";
// /day11_hist/DetailServlet?id=1 访问DetailSErvlet的servlet程序,同时传递 名为id,值为1 的参数
html += "<td>"+p.getId()+"</td><td><a href='"+req.getContextPath()+"/DetailServlet?id="+p.getId()+"'>"+p.getProName()+"</a></td><td>"+p.getProType()+"</td><td>"+p.getPrice()+"</td>";
html += "<tr>";
}
}
html += "</table>"; /**
* 显示浏览过的商品
*/
html += "最近浏览过的商品:<br/>";
//取出prodHist的cookie
Cookie[] cookies = req.getCookies();
if(cookies!=null){
for (Cookie cookie : cookies) {
if(cookie.getName().equals("prodHist")){
String prodHist = cookie.getValue(); // 3,2,1
String[] ids = prodHist.split(",");
//遍历浏览过的商品id
for (String id : ids) {
//查询数据库,查询对应的商品
Product p = dao.findById(id);
//显示到浏览器
html += ""+p.getId()+"&nbsp;"+p.getProName()+"&nbsp;"+p.getPrice()+"<br/>";
}
}
}
} html += "</body>";
html += "</html>"; writer.write(html); } @Override
public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doGet(req, resp);
}
}

最后给出商品详情界面

 package com.infaraway.servlet;

 import com.infaraway.dao.ProductDao;
import com.infaraway.entity.Product; import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.Collection;
import java.util.LinkedList; import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Created by :Infaraway
* DATE : 2017/3/25
* Time : 14:34
* Funtion : 商品信息详细页面
*/
public class DetailServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
//1.获取传来的商品id
String id = request.getParameter("id"); //2. 创建dao,进行商品的操作
ProductDao dao = new ProductDao();
Product product = dao.findById(id); //3.将商品信息打印到浏览器页面
PrintWriter writer = response.getWriter();
String html = ""; html += "<html>";
html += "<head>";
html += "<title>商品详情</title>";
html += "</head>";
html += "<body>";
html += "<table border='1' align='center' width='300px'>";
if(product!=null){
html += "<tr><th>编号:</th><td>"+product.getId()+"</td></tr>";
html += "<tr><th>商品名称:</th><td>"+product.getProName()+"</td></tr>";
html += "<tr><th>商品类型:</th><td>"+product.getProType()+"</td></tr>";
html += "<tr><th>商品价格:</th><td>"+product.getPrice()+"</td></tr>";
} html += "</table>";
html += "<center><a href='"+request.getContextPath()+"/ListServlet'>[返回列表]</a></center>";
html += "</body>";
html += "</html>"; writer.write(html); /**
* 将浏览过的商品存入cookie
*/
//1.创建cookie
Cookie cookie = new Cookie("prodHist",createValue(request,id));
cookie.setMaxAge(1*30*24*60*60);//设置cookie有效时间(单位:s)
//2.保存cookie
response.addCookie(cookie);
} /**
* 生成cookie的值信息
* 当前cookie值 --> 传入的商品id --> 最终的cookie值
* null或没有prodHist 1 1 (算法: 直接返回传入的id )
* 1 2 2,1 (没有重复且小于3个。算法:直接把传入的id放最前面 )
* 2,1 1 1,2(有重复且小于3个。算法:去除重复id,把传入的id放最前面 )
* 3,2,1 2 2,3,1(有重复且3个。算法:去除重复id,把传入的id放最前面)
* 3,2,1 4 4,3,2(没有重复且3个。算法:去最后的id,把传入的id放最前面)
*/
private String createValue(HttpServletRequest request,String id) { Cookie[] cookies = request.getCookies();
String prodHist = null;
if(cookies!=null){
for (Cookie cookie : cookies) {
if(cookie.getName().equals("prodHist")){
prodHist = cookie.getValue();
break;
}
}
} // null或没有prodHist
if(cookies==null || prodHist==null){
//直接返回传入的id
return id;
} // 3,21 2
//String -> String[] -> Collection :为了方便判断重复id
String[] ids = prodHist.split(",");
Collection<String> colls = Arrays.asList(ids); //<3,21>
// LinkedList 方便地操作(增删改元素)集合
// Collection -> LinkedList
LinkedList<String> list = new LinkedList<String>(colls); //不超过3个
if(list.size()<3){
//id重复
if(list.contains(id)){
//去除重复id,把传入的id放最前面
list.remove(id);
list.addFirst(id);
}else{
//直接把传入的id放最前面
list.addFirst(id);
}
}else{
//等于3个
//id重复
if(list.contains(id)){
//去除重复id,把传入的id放最前面
list.remove(id);
list.addFirst(id);
}else{
//去最后的id,把传入的id放最前面
list.removeLast();
list.addFirst(id);
}
} // LinedList -> String
StringBuffer sb = new StringBuffer();
for (Object object : list) {
sb.append(object+",");
}
//去掉最后的逗号
String result = sb.toString();
result = result.substring(0, result.length()-1);
return result;
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
} }

上述代码可以在这里找到:https://git.oschina.net/infaraway/basisJavaWeb/tree/master/cookie

(二) Session技术

2.1  引入

Cookie的局限:

  • 1)Cookie只能存字符串类型。不能保存对象
  • 2)只能存非中文。
  • 3)1个Cookie的容量不超过4KB。

如果要保存非字符串,超过4kb内容,只能使用session技术!

Session特点:会话数据保存在服务器端。(内存中)

2.2 Session技术核心

HttpSession类:用于保存会话数据

1)创建或得到session对象

  • HttpSession getSession()
  • HttpSession getSession(boolean create)

2)设置session对象

  • void setMaxInactiveInterval(int interval) : 设置session的有效时间
  • void invalidate() : 销毁session对象
  • java.lang.String getId() : 得到session编号

3)保存会话数据到session对象

  • void setAttribute(java.lang.String name, java.lang.Object value) : 保存数据
  • java.lang.Object getAttribute(java.lang.String name) : 获取数据
  • void removeAttribute(java.lang.String name) : 清除数据

2.3 Session原理

问题: 服务器能够识别不同的浏览者!

关键: 在哪个session域对象保存数据,就必须从哪个域对象取出!

代码解读:HttpSession session = request.getSession();

1)第一次访问创建session对象,给session对象分配一个唯一的ID,叫JSESSIONID

  new HttpSession();

2)把JSESSIONID作为Cookie的值发送给浏览器保存

  Cookie cookie = new Cookie("JSESSIONID", sessionID);

  response.addCookie(cookie);

3)第二次访问的时候,浏览器带着JSESSIONID的cookie访问服务器

4)服务器得到JSESSIONID,在服务器的内存中搜索是否存放对应编号的session对象。
if(找到){
  return map.get(sessionID);
}
Map<String,HttpSession>

5)如果找到对应编号的session对象,直接返回该对象

6)如果找不到对应编号的session对象,创建新的session对象,继续走1的流程

结论:通过JSESSION的cookie值在服务器找session对象!

 import java.io.IOException;

 import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* Created by :Infaraway
* DATE : 2017/3/25
* Time : 14:34
* Funtion : session对象的创建
*/
public class CreateSession extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1.创建session对象
HttpSession session = request.getSession();
//得到session编号
System.out.println("id="+session.getId());
//修改session的有效时间
//session.setMaxInactiveInterval(20); //手动发送一个硬盘保存的cookie给浏览器
Cookie c = new Cookie("JSESSIONID",session.getId());
c.setMaxAge(60*60);
response.addCookie(c); //2.保存会话数据
session.setAttribute("name", "Infaraway");
}
}
 package com.infaraway.servlet;

 import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException; /**
* Created by :Infaraway
* DATE : 2017/3/25
* Time : 22:17
* Funtion :
*/
public class DeleteCookie extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/**
* 需求: 删除cookie
*/
Cookie cookie = new Cookie("name","xxxx");
cookie.setMaxAge(0);//删除同名的cookie
response.addCookie(cookie);
System.out.println("删除成功"); }
}

2.4  Sesson细节

1)java.lang.String getId() : 得到session编号

2)两个getSession方法:

  • getSession(true) / getSession() : 创建或得到session对象。没有匹配的session编号,自动创 建新的session对象。
  • getSession(false): 得到session对象。没有匹配的session编号,返回null

3)void setMaxInactiveInterval(int interval) : 设置session的有效时间

session对象销毁时间:

  • 1 默认情况30分服务器自动回收
  • 2 修改session回收时间
  • 3 全局修改session有效时间
 <!-- 修改session全局有效时间:分钟 -->
<session-config>
  <session-timeout>1</session-timeout>
</session-config>
  • 4.手动销毁session对象

    void invalidate() : 销毁session对象

4)如何避免浏览器的JSESSIONID的cookie随着浏览器关闭而丢失的问题?

  浏览器关闭而丢失cookie的原因是cookie的有效时间设置中参数为负整数导致,因此需求使用setMaxAge()函数将时间修正为正整数即可。

 /**
* 手动发送一个硬盘保存的cookie给浏览器
*/
Cookie c = new Cookie("JSESSIONID",session.getId());
c.setMaxAge(60*60);
response.addCookie(c);

上述代码可以在这里找到:https://git.oschina.net/infaraway/basisJavaWeb/tree/master/session

总结:

1)会话管理: 浏览器和服务器会话过程中的产生的会话数据的管理。

2)Cookie技术:

  • new Cookie("name","value")
  • response.addCookie(coookie)
  • request.getCookies()

3)Session技术

  • request.getSession();
  • setAttrbute("name","会话数据");
  • getAttribute("会话数据")

会话管理(Cookie/Session技术)的更多相关文章

  1. 会话管理之session技术

    上一节我们总结了cookie技术,这节主要总结一下session技术. 1. session对象 在web开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占 ...

  2. [ASP.NET][Session] 使用 SQLServer 会话管理解决 Session 丢失问题

    使用 SQLServer 会话管理解决 Session 丢失问题 步骤 1.通过命令行执行 aspnet_regsql.exe 程序(不要双击安装),先在 CMD 中输入命令 cd C:\Window ...

  3. 会话管理---Cookie与Session

    会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话. 保存会话数据的两种技术:Cookie,Session Cookie是客户端技术, ...

  4. php会话控制cookie/session

    设置cookie PHP设置Cookie最常用的方法就是使用setcookie函数,setcookie具有7个可选参数,我们常用到的为前5个: name( Cookie名)可以通过$_COOKIE[' ...

  5. JavaWeb基础—会话管理之Session

    一.什么是session session类似于客户端在服务器端的账户.使用Map存放 一个会话锁定一个用户(一般情况下是一个客户端,即一个浏览器独占一个session对象),即使使用浏览器访问其他程序 ...

  6. 测开之路一百三十八:会话管理之session

    session管理和使用,需要用到flask的session模块和设置安全码:app.secret_key 比如列表页和编辑功能只能给admin用 列表页 编辑页 添加session 登录成功时,把u ...

  7. Java中的会话管理——HttpServlet,Cookies,URL Rewriting(译)

    参考谷歌翻译,关键字直接使用英文,原文地址:http://www.journaldev.com/1907/java-session-management-servlet-httpsession-url ...

  8. shiro会话管理

    Shiro提供了完整的企业级会话管理功能,不依赖于底层容器(如web容器tomcat),不管JavaSE还是JavaEE环境都可以使用,提供了会话管理.会话事件监听.会话存储/持久化.容器无关的集群. ...

  9. Java 中的会话管理—— HttpServlet,Cookies,URL Rewriting(转)

    索引 1.什么是 Session? 2.Java 中的会话管理—— Cookie 3.Java Servlet 中的 Session —— HttpSession 理解 JSESSIONID Cook ...

随机推荐

  1. wcf ServiceContract

    ServiceContract是什么 ServiceContract怎么用

  2. .Net下的分库分表帮助类——用分库的思想来分表

    简介     在大型项目中,我们会遇到分表分库的情景.      分库,将不同模块对应的表拆分到对应的数据库下,其实伴随着公司内分布式系统的出现,这个过程也是自然而然就发生了,对应商品模块和用户模块, ...

  3. .NET跨平台之旅:博问站点迁移至ASP.NET Core on Linux并发布上线

    Powered by ASP.NET Core on Linux! 我们全站的 .NET Core 迁移工作如火如荼,这是我们今年上半年的重要工作. 今天我们终于完成了博问产品(q.cnblogs.c ...

  4. Zabbix简介及安装

    前言 未经监控就上线的系统,就是裸奔,耍流氓. 监控对我们来说太重要了,监控工具也有很多,像,Cacti,Nagios,Ganglia,Zabbix等等,今天我们要介绍的是Zabbix,它的功能很强大 ...

  5. xargs命令详解,xargs与管道的区别

    为什么要用xargs,问题的来源 在工作中经常会接触到xargs命令,特别是在别人写的脚本里面也经常会遇到,但是却很容易与管道搞混淆,本篇会详细讲解到底什么是xargs命令,为什么要用xargs命令以 ...

  6. react基础学习

    什么是react:React(有时称为React.js 或ReactJS)是一个为数据提供渲染HTML视图的开源JavaScript库; 其特点: 声明式设计:采用声明范式,可以轻松描述应用高效:通过 ...

  7. 每日java基础知识(01)

    1.java语言的主要特点. 跨平台性:一个应用可以不经过修改,就直接在不同的平台上运行. 面向对象:java是面向对象的语言,可以使用对象封装事物的属性和行为,可以使用面向对象的思想进行分析设计,并 ...

  8. 在Windows平台搭建轻巧的Python开发环境——面向工程和科研的扩展包配置

    首先,下载最新版本的Python. 为什么强调最新版本呢,因为新版本的漏洞通常会少得多,而且反映了未来的趋势. 既然要学,何不起点高一点? 官方下载地址:https://www.python.org/ ...

  9. React组件开发(二)表达式

    var obj = { name:"xiaoming", age:"18" } var Hello= React.createClass({ render:fu ...

  10. 使用python操作InfluxDB

    环境: CentOS6.5_x64InfluxDB版本:1.1.0Python版本 : 2.6 准备工作 启动服务器 执行如下命令: service influxdb start 示例如下: [roo ...