0%

Pipeline和Value

Pipeline是管道,而Value就是管道中的阀门,Request和Response对象在管道中通过各个阀门的处理和控制。

每一个容器中都包含有管道

1
protected final Pipeline pipeline = new StandardPipeline(this);

且管道中都有一个必不可少的basic value,StandardContext对应的basic value为StandardContextValve,StandardEngine对应的basic value为StandardEngineValve,StandardHost对应的basic value为StandardHostValve,StandardWrapper对应的basic value为StandardWrapperValve

value存储

value是链式存储的,通过getNext、setNext来实现链式关系

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public void addValve(Valve valve) {

// Add this Valve to the set associated with this Pipeline
if (first == null) {
first = valve;
valve.setNext(basic);
} else {
Valve current = first;
while (current != null) {
if (current.getNext() == basic) {
current.setNext(valve);
valve.setNext(basic);
break;
}
current = current.getNext();
}
}

container.fireContainerEvent(Container.ADD_VALVE_EVENT, valve);
}

maven编码格式

在使用maven进行构建的时候,发现打印的日志中显示maven的编码格式使用的是GBK

1
[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!

这可不行,我的项目使用的都是UTF-8,得改一下编码格式

如何修改呢?

在环境变量中新建变量MAVEN_OPTS值为 -Dfile.encoding=UTF-8

修改后再去使用mvn --version看一下,,发现变成UTF-8了

1
2
Default locale: zh_CN, platform encoding: UTF-8
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"

也可以在pom文件中配置project.build.sourceEncoding属性

1
2
3
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

spark连接jdbc

spark提供了一个JdbcRDD来进行连接数据库

1
2
3
4
5
6
def createConnection() ={
Class.forName("com.mysql.jdbc.Driver").newInstance()
DriverManager.getConnection("jdbc:mysql://localhost/test")
}

val datas = new JdbcRDD(sc, createConnection(), "select * from user")

redis过期提醒

有一次看redis的配置文件发现一个notify-keyspace-events配置,注释里边长篇大论的,那我得看看这是干啥的,看完注释内容,发现不得了了,redis竟然还有过期提醒的功能

接下来得大家解释一下:

首先呢,这个功能是基于发布订阅的,通过key的事件来触发发布订阅。相关参数有

  • K keyspace 事件,事件以 keyspace@ 为前缀发布
  • E keyevent 事件,事件以 keyevent@ 为前缀发布
  • g 一般性的,非特定类型的命令,比如del,expire,rename等
  • $ 字符串命令
  • l List命令
  • s Set命令
  • h Hash命令
  • z Sorted set命令
  • x 过期事件,当某个键过期并删除时会产生该事件
  • e 驱逐事件,当某个键因 maxmemore 策略而被删除时,产生该事件
  • t Stream命令
  • m Key命中事件
  • A g$lshzxet的别名,所以使用AKE的话表示所有事件

比如我们要实现过期提醒的功能。需要在redis.conf中配置notify-keyspace-events Ex

然后我们订阅该事件__keyevent@*__:expired

1
2
3
## *表示所有db,由于我们监听的是带有模式匹配的,所以使用PSUBSCRIBE
## 如果我们只使用了db0,也可以使用SUBSCRIBE __keyevent@0__:expired来只订阅db0的
PSUBSCRIBE __keyevent@*__:expired

点击劫持

点击劫持是在页面上铺一层透明的iframe,使得点击的时候实际点到的是那层透明的iframe,然后使得iframe中的操作触发。

如何进行防御

  • 可以使用X-Frame-Options,有三个可选值
    • DENY 拒绝当前页面加载任何frame页面
    • SAMEORIGIN frame页面的地址只能为同源域名下的页面
    • ALLOW-FROM origin 定义允许frame加载的页面地址
  • 可以使用CSP(Content Security Policy)