Happyjava's blog site

Happyjava's blog site,分享编程知识,顺便发发牢骚

0%

由于项目需要打包下载素材,所以需要用到打包压缩功能。谷歌了下没有找到自己很想要的的工具类,干脆自己研究下写一个。

阅读全文 »

好友抖音面试

前段时间,好朋友Hellovass参加抖音的面试(高级Android开发工程师)。按照字节的惯例,手撸算法是跑不了的。首先在这里祝好朋友在抖音一切顺利,事事顺心。

题目

终于有心思静下心来搞点事情了,第一件事就是先回顾下好友的面试真题:LeetCode第297题——《二叉树的序列化与反序列化》。

阅读全文 »

源码方式安装cmake

  • 下载cmake源码
1
wget https://github.com/Kitware/CMake/releases/download/v3.18.0-rc2/cmake-3.18.0-rc2.tar.gz
  • 安装
1
2
3
4
5
6
# 解压
tar -zxvf cmake-3.18.0-rc2.tar.gz
cd cmake-3.18.0-rc2.tar.gz
./configure
make
make install
阅读全文 »

让人眼花的底色

微软把WSL引入到了win10中,相信很多人也因此用了WSL中的Ubuntu系统。然后ls windows目录的时候,会有让人看起来眼花的底色:

这就让人很头晕了,反正我是受不了~~~

其实这个底色的意思是Others用户有写权限,可以手动把权限改为chmod 775,那么底色就会不见了。

当然这不是个好办法,可以通过改配置文件的方式把文件夹底色给替换掉。

阅读全文 »

前言

在前面已经介绍过了SSO单点登录的一些理论知识:登录那些事(一):用简单的话来讲讲SSO单点登录。今天我们就通过一个demo来实现下这个CAS系统。

准备工作

建表

1
2
3
4
5
6
7
8
9
CREATE TABLE `users` (
`id` int NOT NULL AUTO_INCREMENT,
`username` varchar(255) COLLATE utf8mb4_general_ci NOT NULL,
`password` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

# 插入一条默认数据
INSERT INTO `cas`.`users`(`id`, `username`, `password`) VALUES (1, 'happyjava', '123456');
阅读全文 »

传统的登录模式

每一个系统都做一套登录功能,登录了A系统之后,如果想要使用B系统,那么需要再登录一次,即使两个系统的账号是一致的。

假设一个企业有A B两个系统,那么用户登录这两个系统需要两个cookie来保存两个系统的登录信息。

这样做的好处是开发方便,在单机的情况下直接使用session和cookie即可完成一个这样的登录设计。缺点就是用户使用不同的系统,需要多次登录,体验不够好。

阅读全文 »

根据网上的资料配置,还是未能解决跨域的问题,错误如下:

1
has been blocked by CORS policy: The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'.

网上的配置如下:

1
2
3
4
5
6
beego.InsertFilter("/*", beego.BeforeRouter, cors.Allow(&cors.Options{
AllowAllOrigins: true,
AllowMethods: []string{"*"},
AllowHeaders: []string{"*"},
AllowCredentials: true,
}))
阅读全文 »

使用命令行传递参数,提示:

1
flag provided but not defined: -xxxxx'

错误。

原因是把 flag.Parse() 调用放在了获取参数之前。应该在获取参数之后调用flag.Parse()

1
2
3
4
5
6
7
8
9
10
11
import (
"flag"
"fmt"
)

func main() {
username := flag.String("username", "defaultName", "username")
// 放在获取参数之后
flag.Parse()
fmt.Println("username=", *username)
}