0%

RequestMappingHandlerMapping 介绍

RequestMappingHandlerMappingSpringMVC中的一个重要组件,作用是扫描@Controller@RequestMapping注解修饰的类,然后生成请求方法的对应关系,当有一个 HTTP 请求进入 SpringMVC 时,就会通过请求找到对应的方法进行执行。

可以简单的想象一下,在RequestMappingHandlerMapping会维护一个Map<String,Handle>,key 存放的是URI,value 存放的是对应处理的handle,例如:

1
2
map.put("GET /user",UserController#get)
map.put("POST /user",UserController#create)

这样通过解析请求就可以很快的找到对应的方法去执行,当然 SpringMVC 的实现肯定不会像上面一样这么简单,不过思路是差不多的。

阅读全文 »

背景

最近在开发一个功能时,需要通过 http 协议上报大量的日志内容,但是在 Go 标准库里的 http client 的 API 是这样的:

1
http.NewRequest(method, url string, body io.Reader)

body 是通过io.Reader接口来传递,并没有暴露一个io.Writer接口来提供写入的办法,先来看看正常情况下怎么写入一个body,示例:

1
2
buf := bytes.NewBuffer([]byte("hello"))
http.Post("localhost:8099/report","text/pain",buf)

需要先把要写入的数据放在Buffer中,放内存缓存着,但是我需要写入大量的数据,如果都放内存里肯定要 OOM 了,http client 并没有提供流式写入的方法,我这么大的数据量直接用Buffer肯定是不行的,最后在 google 了一番之后找到了解决办法。

阅读全文 »

前言

网上都在调侃CRUD没有技术含量,但是不可否认的是在工作中无可避免的要做大量的CRUD,这里面会存在大量的重复工作,意味着可能会写大量的冗余代码,秉着能少写一行代码绝不多写一行的原则,不应该把时间浪费在这些重复的工作中的,在这里分享两个方案来用尽量少的代码实现CRUD,一个是spring-data-rest还有一个是我自己封装的一套框架monkey-spring-boot-starter,下面一一进行介绍。

阅读全文 »

HSTS 简介

HSTS(HTTP Strict Transport Security)是一套由互联网工程任务组发布的互联网安全策略机制。网站可以选择使用 HSTS 策略,来让浏览器强制使用 HTTPS 与网站进行通信,以减少会话劫持风险。

背景

有时候由于某些开发的需要,想访问 http 协议的接口,但是由于 HSTS 的机制,浏览器一直会强制跳转到 https,没办法调试,所以得把 HSTS 记录清除掉。

清除步骤

  1. 浏览器访问chrome://net-internals/#hsts
  2. 找到Delete domain security policies选项,输入对应的域名点击删除即可

前言

平常开发 spark 应用的时候,为了快速验证程序是否正确一般都会设置masterlocal模式来运行,但是如果想用集群环境来运行的话,就需要打一个 jar 包用spark-submit进行任务提交,但是在开发过程中频繁打 jar 包提交也是一件麻烦事,查阅相关资料之后发现其实可以在本地运行代码的时候指定集群环境来运行,达到快速调试的目的。

阅读全文 »

前言

最近在公司搭建了一个 CDH 测试环境集群,从官网得知 CDH 在 6.3.3 版本开始不再提供免费版本了,于是选择了 6.2.x 版本进行安装,这里记录一下正确的离线安装步骤,避免下次安装时又踩坑。

阅读全文 »

环境信息

  • windows 10
  • IDEA 2019.3

不用下载scalasbt,直接使用 IDEA 插件中自带的就行。

阅读全文 »

前言

最近把 win10 版本升级到了1909,然后发现在有个Windows Defender Antivirus Server的服务会占用大量的 cpu 和内存,网上找了好多办法都关不掉它,现在终于找了个靠谱的办法在这里记录下。

阅读全文 »

前言

用过OOP的都知道,子类重写父类的方法可以优雅的实现代码的复用,例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
public abstract class People {
String name;
int age;

public People(String name, int age) {
this.name = name;
this.age = age;
}

public void hello() {
System.out.printf("name:%s age:%d sex:%s\n", name, age, sex());
}

public abstract String sex();

static class Male extends People {

public Male(String name, int age) {
super(name, age);
}

@Override
public String sex() {
return "M";
}
}

static class Female extends People {

public Female(String name, int age) {
super(name, age);
}

@Override
public String sex() {
return "F";
}
}

public static void main(String[] args) {
new Male("小明",20).hello();
new Female("小红",18).hello();
}
}

输出:

1
2
name:小明 age:20 sex:M
name:小红 age:18 sex:F

但是go不支持OOP,那么在go中要类似情况的应该怎么实现?

阅读全文 »

背景

通常验证码都是通过session来实现,在服务端生成一个随机字符串作为验证码,将该字符串存到session中,然后将验证码图片渲染到前端,前端提交之后通过session中存放的正确验证码进行对比从而验证输入的正确性。

上面是一个典型的验证码实现的流程,但是这种方案存在非常多的弊端,例如:

  1. 分布式应用:大家知道session是有状态的,当服务器存在多个时,需要去处理session丢失的问题。
  2. 跨域问题:现在前后端分离大行其道,cookie跨域问题会导致session id无法正确传递,需要去处理cookie跨域的问题。
  3. 开销问题:维护session需要消耗一定服务器的资源。
阅读全文 »