Merge branch 'master' into patch-2

This commit is contained in:
astaxie
2018-09-30 15:36:31 +08:00
committed by GitHub
10 changed files with 15 additions and 14 deletions

View File

@@ -216,7 +216,7 @@ We define some constants and customized types.
Then we defined some methods for our customized types.
- `Volume()` uses Box as its receiver and returns the volume of Box.
- `SetColor(`c Color) changes Box's color.
- `SetColor(c Color)` changes Box's color.
- `BiggestsColor()` returns the color which has the biggest volume.
- `PaintItBlack()` sets color for all Box in BoxList to black.
- `String()` use Color as its receiver, returns the string format of color name.

View File

@@ -4,7 +4,7 @@
## سه روش برای نصب Go
راه های زیادی برای تنظیم محیز توسعه ی Go بر روی کامپیوتر وجود دارند، و شما می توانید از هر یک از این روش ها به دلخواه خود استفاده کنید. به طور کلی سه روش زیر، به عنوان رایج ترین روش ها شناخته می شوند:
راه های زیادی برای تنظیم محیط توسعه ی Go بر روی کامپیوتر وجود دارند، و شما می توانید از هر یک از این روش ها به دلخواه خود استفاده کنید. به طور کلی سه روش زیر، به عنوان رایج ترین روش ها شناخته می شوند:
- نصب پکیج های رسمی.
- تیم توسعه ی Go پکیج های جامعی را برای ویندوز، لینوکس، مک و سایر سیستم عامل ها فراهم کرده است. این روش نصب، شاید ساده ترین روش ممکن برای شروع باشد. شما می توانید به [صفحه ی دانلود Golang](https://golang.org/dl/) مراجعه کرده و فایل نصبی مورد نظر خود را دانلود کنید.
@@ -196,4 +196,4 @@ Homebrew ابزاری برای مدیریت نرم افزار می باشد که
- بخش قبلی: [پیکربندی محیط Go](01.0.md)
- بخش بعدی: [$GOPATH و فضای کاری](01.2.md)
</div>
</div>

View File

@@ -32,7 +32,7 @@ Execute os comandos abaixo:
cd $GOPATH/src
mkdir mymath
Crie um novo arquivo chamado `sqrt.go` e ponha o seguinte conteúdo:
Crie um novo arquivo chamado `sqrt.go` e adicione o seguinte conteúdo:
// Código fonte de $GOPATH/src/mymath/sqrt.go
package mymath

View File

@@ -50,7 +50,7 @@ URL(Uniform Resource Locator)是“统一资源定位符”的英文缩写,用
5. 如果本地DNS服务器本地区域文件与缓存解析都失效则根据本地DNS服务器的设置是否设置转发器进行查询如果未用转发模式本地DNS就把请求发至 “根DNS服务器”“根DNS服务器”收到请求后会判断这个域名(.com)是谁来授权管理并会返回一个负责该顶级域名服务器的一个IP。本地DNS服务器收到IP信息后将会联系负责.com域的这台服务器。这台负责.com域的服务器收到请求后如果自己无法解析它就会找一个管理.com域的下一级DNS服务器地址(qq.com)给本地DNS服务器。当本地DNS服务器收到这个地址后就会找qq.com域服务器重复上面的动作进行查询直至找到www.qq.com主机。
6. 如果用的是转发模式此DNS服务器就会把请求转发至上一级DNS服务器由上一级服务器进行解析上一级服务器如果不能解析或找根DNS或把转请求转至上上级以此循环。不管本地DNS服务器用是转发还是根提示最后都是把结果返回给本地DNS服务器由此DNS服务器再返回给客户机。
6. 如果用的是转发模式此DNS服务器就会把请求转发至上一级DNS服务器由上一级服务器进行解析上一级服务器如果不能解析或找根DNS或把转请求转至上上级以此循环。不管本地DNS服务器用是转发还是根提示最后都是把结果返回给本地DNS服务器由此DNS服务器再返回给客户机。
![](images/3.1.dns_inquery.png?raw=true)
@@ -68,7 +68,7 @@ HTTP协议是Web工作的核心所以要了解清楚Web的工作方式就需
HTTP是一种让Web服务器与浏览器(客户端)通过Internet发送与接收数据的协议,它建立在TCP协议之上一般采用TCP的80端口。它是一个请求、响应协议--客户端发出一个请求服务器响应这个请求。在HTTP中客户端总是通过建立一个连接与发送一个HTTP请求来发起一个事务。服务器不能主动去与客户端联系也不能给客户端发出一个回调连接。客户端与服务器端都可以提前中断一个连接。例如当浏览器下载一个文件时你可以通过点击“停止”键来中断文件的下载关闭与服务器的HTTP连接。
HTTP协议是无状态的同一个客户端的这次请求和上次请求是没有对应关系对HTTP服务器来说它并不知道这两个请求是否来自同一个客户端。为了解决这个问题 Web程序引入了Cookie机制来维护连接的可持续状态。
HTTP协议是无状态的同一个客户端的这次请求和上次请求是没有对应关系对HTTP服务器来说它并不知道这两个请求是否来自同一个客户端。为了解决这个问题 Web程序引入了Cookie机制来维护连接的可持续状态。
>HTTP协议是建立在TCP协议之上的因此TCP攻击一样会影响HTTP的通讯例如比较常见的一些攻击SYN Flood是当前最流行的DoS拒绝服务攻击与DdoS分布式拒绝服务攻击的方式之一这是一种利用TCP协议缺陷发送大量伪造的TCP连接请求从而使得被攻击方资源耗尽CPU满负荷或内存不足的攻击方式。

View File

@@ -1,6 +1,6 @@
# 3.2 Go搭建一个Web服务器
前面小节已经介绍了Web是基于http协议的一个服务Go语言里面提供了一个完善的net/http包通过http包可以很方便的搭建起来一个可以运行的Web服务。同时使用这个包能很简单地对Web的路由静态文件模版cookie等数据进行设置和操作。
前面小节已经介绍了Web是基于http协议的一个服务Go语言里面提供了一个完善的net/http包通过http包可以很方便的搭建起来一个可以运行的Web服务。同时使用这个包能很简单地对Web的路由静态文件模版cookie等数据进行设置和操作。
## http包建立Web服务器
```Go

View File

@@ -15,7 +15,7 @@ Handler处理请求和生成返回信息的处理逻辑
## 分析http包运行机制
下图所示,是Go实现Web服务的工作模式的流程图
下图是Go实现Web服务的工作模式的流程图
![](images/3.3.http.png?raw=true)
@@ -80,7 +80,7 @@ func (srv *Server) Serve(l net.Listener) error {
图3.10 一个http连接处理流程
至此我们的三个问题已经全部得到了解答你现在对于Go如何让Web跑起来的是否已经基本了解呢
至此我们的三个问题已经全部得到了解答你现在对于Go如何让Web跑起来的是否已经基本了解呢?
## links

View File

@@ -2,7 +2,7 @@
表单是我们平常编写Web应用常用的工具通过表单我们可以方便的让客户端和服务器进行数据的交互。对于以前开发过Web的用户来说表单都非常熟悉但是对于C/C++程序员来说,这可能是一个有些陌生的东西,那么什么是表单呢?
表单是一个包含表单元素的区域。表单元素是允许用户在表单中(比如:文本域、下拉列表、单选框、复选框等等)输入信息的元素。表单使用表单标签(\<form\>)定义。
表单是一个包含表单元素的区域。表单元素(比如:文本域、下拉列表、单选框、复选框等等)是允许用户在表单中输入信息的元素。表单使用表单标签(\<form\>)定义。
<form>
...
@@ -10,7 +10,7 @@
...
</form>
Go里面对于form处理已经有很方便的方法了在Request里面有专门的form处理可以很方便的整合到Web开发里面来4.1小节里面将讲解Go如何处理表单的输入。由于不能信任任何用户的输入所以我们需要对这些输入进行有效性验证4.2小节将就如何进行一些普通的验证进行详细的演示。
Go里面对于form处理已经有很方便的方法了在Request里面有专门的form处理可以很方便的整合到Web开发里面来4.1小节里面将讲解Go如何处理表单的输入。由于不能信任任何用户的输入所以我们需要对这些输入进行有效性验证4.2小节将就如何进行一些普通的验证进行详细的演示。
HTTP协议是一种无状态的协议那么如何才能辨别是否是同一个用户呢同时又如何保证一个表单不出现多次递交的情况呢4.3和4.4小节里面将对cookie(cookie是存储在客户端的信息能够每次通过header和服务器进行交互的数据)等进行详细讲解。

View File

@@ -87,7 +87,7 @@ login函数中我们根据`r.Method`来判断是显示登录界面还是处理
![](images/4.1.slice.png?raw=true)
图4.2 服务器端打印接到的信息
图4.2 服务器端打印接到的信息
`request.Form`是一个url.Values类型里面存储的是对应的类似`key=value`的信息下面展示了可以对form数据进行的一些操作:
```Go

View File

@@ -3,6 +3,7 @@ Web开发中一个很重要的议题就是如何做好用户的整个浏览过
6.1小节里面讲介绍session机制和cookie机制的关系和区别6.2讲解Go语言如何来实现session里面讲实现一个简易的session管理器6.3小节讲解如何防止session被劫持的情况如何有效的保护session。我们知道session其实可以存储在任何地方6.4小节里面实现的session是存储在内存中的但是如果我们的应用进一步扩展了要实现应用的session共享那么我们可以把session存储在数据库中(memcache或者redis)6.5小节将详细的讲解如何实现这些功能。
## 目录
![](images/navi6.png?raw=true)

View File

@@ -3,9 +3,9 @@ session和cookie是网站浏览中较为常见的两个概念也是比较难
如何抓取一个访问受限的网页?如新浪微博好友的主页,个人微博页面等。
显然,通过浏览器,我们可以手动输入用户名和密码来访问页面,而所谓的“抓取”,其实就是使用程序来模拟完成同样的工作,因此我们需要了解“登”过程中到底发生了什么。
显然,通过浏览器,我们可以手动输入用户名和密码来访问页面,而所谓的“抓取”,其实就是使用程序来模拟完成同样的工作,因此我们需要了解“登”过程中到底发生了什么。
当用户来到微博登页面输入用户名和密码之后点击“登录”后浏览器将认证信息POST给远端的服务器服务器执行验证逻辑如果验证通过则浏览器会跳转到登录用户的微博首页在登录成功后服务器如何验证我们对其他受限制页面的访问呢因为HTTP协议是无状态的所以很显然服务器不可能知道我们已经在上一次的HTTP请求中通过了验证。当然最简单的解决方案就是所有的请求里面都带上用户名和密码这样虽然可行但大大加重了服务器的负担对于每个request都需要到数据库验证也大大降低了用户体验(每个页面都需要重新输入用户名密码,每个页面都带有登录表单)。既然直接在请求中带上用户名与密码不可行那么就只有在服务器或客户端保存一些类似的可以代表身份的信息了所以就有了cookie与session。
当用户来到微博登页面输入用户名和密码之后点击“登录”后浏览器将认证信息POST给远端的服务器服务器执行验证逻辑如果验证通过则浏览器会跳转到登录用户的微博首页在登录成功后服务器如何验证我们对其他受限制页面的访问呢因为HTTP协议是无状态的所以很显然服务器不可能知道我们已经在上一次的HTTP请求中通过了验证。当然最简单的解决方案就是所有的请求里面都带上用户名和密码这样虽然可行但大大加重了服务器的负担对于每个request都需要到数据库验证也大大降低了用户体验(每个页面都需要重新输入用户名密码,每个页面都带有登录表单)。既然直接在请求中带上用户名与密码不可行那么就只有在服务器或客户端保存一些类似的可以代表身份的信息了所以就有了cookie与session。
cookie简而言之就是在本地计算机保存一些用户操作的历史信息当然包括登录信息并在用户再次访问该站点时浏览器通过HTTP协议将本地cookie内容发送给服务器从而完成验证或继续上一步操作。