1.Go的XSS(跨站脚本攻击)的防护应该结合以下两种方式。
1.1 验证所有输入数据,有效检测攻击。
1.2 对所有输出数据进行适当的处理,以防止任何已成功注入的脚本在浏览器端运行。
func HTMLEscape(w io.Writer, b []byte) // 把 b 进行转义之后写到 w
func HTMLEscapeString(s string) string // 转义 s 之后返回结果字符串
func HTMLEscaper(args ...interface{}) string // 支持多个参数一起转义,返回结果字符串
使用template.HTML()转义用来正常显示输入。
2. defer、return、返回值三者的执行先后逻辑
2.1 多个defer的执行顺序为“后进先出”;
2.2 defer、return、返回值三者的执行逻辑应该是:return最先执行,return负责将结果写入返回值中;接着defer开始执行一些收尾工作;最后函数携带当前返回值退出。
3.Go设计模式
Golang设计模式目录 https://www.jianshu.com/p/b31f34cddf81
常见设计模式——go实现 https://zhuanlan.zhihu.com/p/91997566
3.1.1 单例模式(懒汉模式)
type Singleton struct{}
var Instance *Singleton
func GetInstance() *Singleton {
if Instance == nil {
Instance = &Singleton{}
}
return Instance
}
3.1.2 Once实现懒汉模式
var Instance5 *Singleton
var once sync.Once
func GetInstance5() *Singleton {
once.Do(func() {
Instance5 = &Singleton{}
})
return Instance5
}
3.2.1 单例模式(饿汉模式)
type Singleton struct{}
var Instance2 *Singleton = &Singleton{}
func GetInstance2() *Singleton {
return Instance2
}
3.2.2 双重锁的懒汉模式
var Instance4 *Singleton
var mut2 sync.Mutex
func GetInstance4() *Singleton {
if Instance4 == nil {
mut2.Lock()
defer mut2.Unlock()
if Instance4 == nil {
Instance4 = &Singleton{}
}
}
return Instance4
}
3.3.1 简单工厂
type Factory struct {
}
type Product interface {
create()
}
func (f Factory) Generate(name string) Product {
switch name {
case "product1":
return Product1{}
case "product2":
return Product2{}
default:
return nil
}
}
//使用
factory := new(Factory)
product1 := factory.Generate("product1")
3.3.2 工厂模式
type FactoryInterface interface {
CreateProduct(t string) ProductInterface
}
type Factory1 struct {
}
func (f Factory1) CreateProduct(t string) ProductInterface {
switch t {
case "product1":
return product1{}
default:
return nil
}
}
//使用
f := new(Factory1)
p1 := f.CreateProduct("product1")
4. 浅谈 Golang struct 与 PHP class 的相似
Golang 中的 struct 与 PHP 的 class 在使用方式上差不多。
struct 中的成员可以类比 class 中的属性,struct 中的成员函数可以类比 class 中的方法。
对比示例:
// Golang
type CollectorOption func(*Collector)
type Collector struct {
UserAgent string
MaxDepth int
}
func NewCollector(options ...CollectorOption) *Collector {
}
func (c *Collector) Visit(URL string) error {
}
// PHP
$options = function (&instance) {
}
class Collector {
public $userAgent;
public $maxDepth;
public function visit(string $url): string
{
//
}
}
function NewCollector(...$options) Collector {
}
5.redis持久化
Redis的持久化有两种方式:RDB和AOF,redis默认采用的是RDB的方式。
RDB:(快照持久化)
触发生成rdb快照文件的方式主要有五种(会生成一个dump.rdb文件):配置文件自动触发、执行save命令、执行bgsave命令、执行shutdown命令、执行flushall命令。
redis.conf 中配置项dbfilename dump.rdb,save m n 同步操作save 60 10000,异步操作bgsave再redis命令行里执行SHUTDOWN或bgsave
AOF(文件追加持久化)
配置文件开启aof持久化方式:appendonly yes appendfilename appendonly.aof
AOF的三种写入策略appendfsync always|everysec|no
redis提供了重写机制来解决对同一个key做多次写操作,从而产生大量文件日志。
可以通过下面命令手动触发重写:bgrewriteaof,也可以通过配置文件自动触发重写:
auto-aof-rewrite-percentage 100:当文件的大小达到原先文件大小
auto-aof-rewrite-min-size 64mb:文件重写的最小文件大小
使用redis-check-aof --fix命令修复AOF文件错误
混合持久化:通过 aof-use-rdb-preamble 参数来开启
在写入的时候先把数据以 RDB 的形式写入文件的开头,再将后续的写命令以 AOF 的格式追加到文件中。
RDB和AOF对比
RDB的优点:节省内存、速度快(二进制形式写入)、适合全量备份和复制场景
RDB的缺点:服务器宕机易丢数据,数据量大易阻塞
每次保存RDB的时候,Redis都要fork出一个子进程,这个过程是阻塞的,如果数据集巨大,那阻塞的时间就会很长。
AOF的优点:数据完整性高,不易丢失,日志文件可读,AOF文件可修复
数据更加完整,丢失数据的可能性较低;
AOF日志文件可读,并且可以对AOF文件修复。
AOF的缺点:AOF日志记录在长期运行中逐渐庞大,恢复很耗时,需定期瘦身处理,恢复备份速度较慢。
6. nodejs部署的服务访问异常
nodejs部署的服务用localhost+端口curl http://localhost:8089可以访问,换成ip+端口curl http://192.168.0.201:8089就无法访问
解决方法1:(无效,防火墙已关闭,添加开放端口无效)
/sbin/iptables -I INPUT -p tcp --dport 8089 -j ACCEPT
service network restart
解决方法2:(有效)
修改或添加online-store\webpack.config.js的port:8089上的host: '0.0.0.0'(不能是127.0.0.1)
再次执行npm run dev出现Project is running at http://0.0.0.0:8089/即可