springboot-security-jwt-example
springboot-security-jwt-example copied to clipboard
Spring Boot + Spring Security + JSON Web Token(JWT) + Mybatis完整示例,包含SpringBoot2和Spring Boot3两种方式。
Spring Security 6 + JWT + Mybatis宿´ç¤ºä¾
1. 设计ç¹ç¹
- JWTåSpring Securityç»åè¿è¡ææéªè¯ã
- æ¥å£æ¯æPojoä¼ åï¼å¨Pojoä¸ä½¿ç¨æ³¨è§£è¿è¡åæ°æ ¡éªï¼ä¾èµSpringçValidationã
- 使ç¨ç»ä¸è¿åçBodyå¯¹è±¡ï¼æ¯æè¿åPojo对象æè Mapå°è£ çæ°æ®éåï¼Bodyä¸ç»ä¸å¤çå页æ¥è¯¢è¿åã
- mybatisæä»¶æ¾ç½®å¨æºä»£ç ç®å½ï¼æç §æ¨¡åæå controllerãpojoãmybatis mapperæä»¶ãæ¯ä¸ªä¸å¡å äºç¸ç¬ç«ï¼ä¸å è®¸åæ¨ªåè°ç¨ï¼å ¬å ±æ¨¡ååæ½è±¡ç»è£ ï¼åæ¥å£è°ç¨ã
- 使ç¨
SqlSessionè°ç¨mapperé ç½®æä»¶ï¼é¿å ç¼åé¢å¤çæ¥å£ã - 使ç¨IDEAæä¾çHTTP Requeståè½è¿è¡æ¥å£æµè¯ï¼æµè¯èæ¬æ¾å¨testç®å½ã
- ææå端æ¥å£è¯·æ±é
ç½®ç»ä¸çåç¼ï¼æ¹ä¾¿ä¸å端使ç¨åä¸PORTè¿è¡é¨ç½²ï¼å端请æ±è½¬åå°æ¬åºç¨è¿è¡å¤çã
- å¨
application.ymléé ç½®server.servlet.context-path屿§ä¸º/apiï¼ææè¯·æ±é»è®¤å¸¦apiåç¼ã
- å¨
- éµå¾ªJavaç驼峰å½ååHTTPçä¸å线å½åï¼å¯¹POJOå¯ç¨Jacksonç
property-naming-strategy = SNAKE_CASEé ç½®ãapplication.ymlä¸é ç½®spring.jackson.property-naming-strategyç屿§ä¸ºSNAKE_CASEï¼å°Java屿§ç驼峰å½å转æ¢ä¸ºhttpçæ åä¸å线å½åã
- ä½¿ç¨æ¶é´åä½é
ç½®ymlæä»¶ï¼å¢å ymlæä»¶ä¸æ¶é´é
ç½®å±æ§å¯è¯»æ§ï¼Springæ¯ææ¶é´åæ°æ®å¤§å°ä¸¤ç§åä½ã
-
使ç¨Durationé ç½®ymlæä»¶ï¼å 许设置æ¶é´åä½æè æ°æ®åä½ãåèï¼Spring Boot宿¹æå3.0.4 Properties Conversion
-
é ç½®æ ·ä¾åèé ç½®æä»¶
application.ymlçjwt.validtiy屿§jwt: # 24 hours validtiy: 24h -
ä»£ç æ ·ä¾åè
JwtTokenPrividerçvalidtiyInMs屿§@Value("${jwt.validtiy}") @DurationUnit(ChronoUnit.MILLIS) private Duration validityInMs;
-
- é ç½®.gitlab-ci.ymlï¼å¯ç¨GitLabåºäºMavençèªå¨æç»éæï¼Auto CIï¼
- ç±»å
³ç³»å¾

2. å·¥ç¨ç®å½ç»æè¯´æ
spring3-jwt-example/ * å·¥ç¨ç®å½åï¼å¯ä»¥æ ¹æ®å®é
é¡¹ç®æ
åµè¿è¡ä¿®æ¹
|- resources
|- application.yml * 主é
ç½®æä»¶ï¼å
嫿¿æ´»é
ç½®æä»¶ï¼jacksonï¼servletï¼jwtï¼æ¥å¿é
ç½®ç
|- application-dev.yml * æ°æ®åºé
ç½®
|- application-druid.xml * alibaba druidæ°æ®åºè¿æ¥æ± é
ç½®
|- application-mybatis.xml * mybatisé
ç½®ï¼å
å«pagehelperé
ç½®
|- log4j2.xml * log4j2é
ç½®æä»¶ï¼é»è®¤æå¼consoleé
ç½®ï¼å¯ä»¥é
ç½®å¼æ¥è¾åºï¼æå°SQLçæ¥å¿çº§å«å¯ä»¥é
置好
|- src/main/java
|- Body.java * controllerè¿åorg.springframework.http.ResponseEntityï¼Bodyæ¯ResponseEntityçæ°æ®ç»æä½ï¼å
¼å®¹@Validè¿åçæ°æ®ç»æï¼å
å«å页忰çå¤ç
|- SpringJwtExampleApplication.java * å¯å¨ç±»ï¼æ ¹æ®é¡¹ç®æ
åµè¿è¡ä¿®æ¹
|- examples.spring.project * æºç å
ç»æï¼æ ¹æ®å®é
项ç®è¿è¡éä¿®æ¹
|- config * æ¡æ¶ç±»çåç§é
ç½®
|- CorsConfig.java * è·¨å请æ±ï¼Cross-Origin Resource Sharingï¼é
ç½®ï¼å·²ç»é
ç½®æå
许ææè¯·æ±ææåæ°
|- SecurityConfig.java * JWTå®å
¨é
ç½®ï¼æéè¦æé¤ä¸åç»å½è¯·æ±è¿æ»¤çuriå¨è¿éé¢é
ç½®
|- SecurityUserDetailsService.java * æ¥è¯¢æ°æ®åºè¿è¡ç»å½éªè¯
|- SecurityUserDetails.java * Security UserDetailsçå®ç°ç±»
|- InvalidJwtAuthenticationException.java * JWTéªè¯èªå®ä¹å¼å¸¸ç±»
|- InvalidAuthenticationEntryPoint.java * JWTç»å½å¤±è´¥æ¶è°ç¨çç±»
|- jwt
|- JwtTokenOncePerRequestFilter.java * JWTè¿æ»¤å¨ï¼éªè¯æ¯æ¬¡è¯·æ±çTokenæ¯å¦ææ
|- JwtTokenProvider.java * JwtToken计ç®å·¥å
·ç±»
|- exception
|- CustomExceptionHandlerjava * 使ç¨@ControllerAdviceå¤çææControlleræåºçå¼å¸¸å¹¶è¿åç»å端ï¼é¿å
å端æ¶å°500é误页é¢
|- users
|- mapper * mybatisæä»¶å¤¹ï¼mybatis mapperæä»¶å¿
é¡»å¨è¿éæä¼è¢«èªå¨æ«æå°ï¼å¨application-mybatis.xmlæä»¶ä¸é
ç½®
|- Login.xml * ç»å½mybatis mapperæä»¶
|- User.xml * ç¨æ·ç®¡çmybatis mapperæä»¶
|- AuthenticationController.java * ç»å½éªè¯ï¼å·æ°tokenï¼è·åå½åç¨æ·çcontrollerç±»
|- UserController.java * ç¨æ·ç®¡çï¼æ ¹æ®é¡¹ç®å®é
æ
åµçè¿è¡ä¿®æ¹
|- UserPojo.java * ç¨æ·ç®¡ç模åé
å¥çä¼ å¼å¯¹è±¡ï¼å¢å äº@Valid注解ï¼å¯ç¨æ ¡éªï¼æ ¡éªé误æç¤ºä¼è¿åç»åç«¯ãæ ¹æ®é¡¹ç®å®é
æ
åµä¿®æ¹åæ®µå±æ§
|- model1 * æ ·ä¾æ¨¡åï¼æ ¹æ®å®é
çæ
åµè¿è¡å½åç¼åï¼æ¯ä¸ªä¸å¡åè½æ¨¡åä¸ä¸ªç¬ç«çå
|- mapper * æ ·ä¾æ¨¡å对åºçmybatis mapperæä»¶
|- Model1.xml * æ ·ä¾mybatis mapperæä»¶
|- Model1Controller.java * æ ·ä¾controllerç±»
|- Model1Pojo.java * æ ·ä¾pojoç±»
|- src/test/java * æµè¯ç¨ä¾åæ¾æä»¶å¤¹
|- examples.spring.project * æµè¯ç¨ä¾å
ï¼ä¿æåæºç å
ç¸å
|- model1
|- model1.http * model1æææ¥å£çIDEA http clientæµè¯ç¨ä¾ï¼æµè¯èæ¬å¯ä»¥ä½¿ç¨JUnit/Postmanæµè¯èæ¬/IDEA http clientä¸è
ä¸çä»»æä¸ç§ï¼
|- passwdtools
|- PasswordTools.java * çæå¯ç çå·¥å
·ç±»ï¼é»è®¤ä½¿ç¨bcryptå 坿¹å¼
|- users
|- users.http * users模åçæµè¯ç¨ä¾
|- .gitignore * gitæäº¤å¿½ç¥æä»¶çé
置项
|- pom.xml * pomé
ç½®ãå½åjwtä¾èµjsonwebtoken.jjwt
3. æ¥å£æ¸ å
3.1. ç»å½éªè¯ï¼/api/authenticateï¼
-
请æ±header
æ
-
请æ±åæ°
| åæ°å | åæ°å¼ | 说æ |
|---|---|---|
| username | admin | ç»å½è´¦å· |
| password | 123456 | ç»å½å¯ç |
- 请æ±ç¤ºä¾
curl -d "username=admin&password=123456" http://localhost:8080/api/authenticate
- ååºåæ°
| åæ°å | 说æ |
|---|---|
| status | ååºç¶æï¼éµå¾ªw3c http codeå½åè§çº¦ï¼200表示æ£å¸¸ |
| message | ååºå¼ä¸ææè¿°ï¼å¯ç¨äºæç¤ºç¨æ· |
| data | ååºæ°æ®ç»æï¼å°è£ è¿åçä¸å¡æ°æ®ç»æ |
- dataååºåæ°
| åæ°å | 说æ |
|---|---|
| username | ç»å½ç¨æ·å |
| token_expiration | tokenè¿ææ¶é´ï¼éè¦å¨è¿æåè°ç¨refresh_tokenå·æ°token |
| token | tokenæ¬èº«ï¼æ³¨ææ¤token没æå
å«Bearer åç¼ï¼è®¾ç½®å°http headeræ¶éè¦å¢å Bearer åç¼ |
- ååºç¤ºä¾
{
"status": 200,
"message": "ç»å½æå",
"data": {
"user_name": "admin",
"token_expiration": "2023-03-28 13:34:06",
"token": "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJhZG1pbiIsInJvbGVzIjpbXSwibmlja25hbWUiOiIiLCJpYXQiOjE2Nzk4OTUyNDYsImV4cCI6MTY3OTk4MTY0Nn0.ddZyCbnHAykshhjfTMftsfr4n5iuYX25TZNb8miZeR3XjwE-Sle3lfS4JHYIKcnjx9aAIURoZhq7u64R125Nfg"
}
}
3.2. å·æ°tokenï¼/api/refresh_tokenï¼
- 请æ±Header
| åæ°å | åæ°å¼ | 说æ |
|---|---|---|
| Accept | application/json | |
| Authorization | Bearer [token] | [token]å¡«åç»å½è·å¾çå®é å¼ |
-
请æ±Body
æ
-
请æ±ç¤ºä¾
æ
-
ååºåæ°
åèç»å½éªè¯æ¥å£
-
ååºç¤ºä¾
åèç»å½éªè¯æ¥å£
3.3. è·åå½åç¨æ·ä¿¡æ¯ï¼/api/current_userï¼
éè¿è¿å¨æææçtokenï¼è·åå½åçç¨æ·ä¿¡æ¯ï¼å¦ætokenå·²ç»å¤±æï¼æ¥å£è¿åhttp code 403ã
- 请æ±Header
| åæ°å | åæ°å¼ | 说æ |
|---|---|---|
| Accept | application/json | |
| Authorization | Bearer [token] | [token]å¡«åç»å½è·å¾çå®é å¼ |
-
请æ±Body
æ
-
请æ±ç¤ºä¾
æ
-
ååºåæ°
| åæ°å | 说æ |
|---|---|
| status | ååºç¶æï¼éµå¾ªw3c http codeå½åè§çº¦ï¼200表示æ£å¸¸ |
| message | ååºå¼ä¸ææè¿°ï¼å¯ç¨äºæç¤ºç¨æ· |
| data | ååºæ°æ®ç»æï¼å°è£ è¿åçä¸å¡æ°æ®ç»æ |
- dataååºåæ°
| åæ°å | 说æ |
|---|---|
| username | ç»å½ç¨æ·åï¼éµå¾ªSpringSecurityçUserDetailçå½åè§èï¼æ²¡æä¸å线åéï¼ |
| nickname | ç¨æ·æµç§°ï¼éµå¾ªSpringSecurityçUserDetailçå½åè§èï¼æ²¡æä¸å线åéï¼ |
| account_non_expired | è´¦å·éè¿ææ è¯ |
| account_non_locked | è´¦å·éé宿 è¯ |
| credentials_non_expired | å¯ç è¿ææ è¯ï¼ä¸æ¯tokenè¿ææ è¯ï¼ |
| enabled | è´¦å·æ¯å¦å¯ç¨ |
- ååºç¤ºä¾
{
"status": 200,
"message": "æåè·åå½åç¨æ·ä¿¡æ¯",
"data": {
"username": "admin",
"nickname": "",
"authorities": [],
"account_non_expired": true,
"account_non_locked": true,
"credentials_non_expired": true,
"enabled": true
}
}
4. æµè¯ç¯å¢æ°æ®åºç¯å¢åå§å
4.1. dockerç¯å¢æåMysql宿¹éå
markvivv@MBP ~ % docker pull mysql
Using default tag: latest
'latest: Pulling from library/mysql
ab8798141d46: Pull complete
75508f0dccd7: Pull complete
b2a1f5f86172: Pull complete
5ccc774632f3: Pull complete
df7d86490565: Pull complete
32480f1416f7: Pull complete
0b89229d2472: Pull complete
229bb5ff022d: Pull complete
a972d41dd67e: Pull complete
c8283d390a92: Pull complete
ddba158ba540: Pull complete
Digest: sha256:ca114710bb35b862062fd51733a7dba1ba3e93be33e4eede442b0ce15c77b718
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest
4.2. å¯å¨Mysql
设置rootè´¦å·é»è®¤å¯ç 1@34qWerï¼æå¡å¨æ¬å°3306ç«¯å£æ å°å®¹å¨3306端å£å¯å¨
markvivv@MBP ~ % docker run --name mysql -e MYSQL_ROOT_PASSWORD=1@34qWer -d mysql:latest
b210f38ea50ccd379e3d45933b89d464b0fabb5f545254ca6f461a5531bfbca9
4.3. æµè¯3306ç«¯å£æ¯å¦æ£å¸¸
markvivv@MBP ~ % telnet 127.0.0.1 3306
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
J
8.0.3b+F13gG?1!b%F8-}Vcaching_sha2_password^CConnection closed by foreign host.
markvivv@MBP ~ %
4.4. è¿å ¥mysqlæ£å¨è¿è¡å®¹å¨çå½ä»¤è¡ç¯å¢
markvivv@MBP ~ % docker exec -it mysql bash
4.5. åå»ºæ°æ®åºå®ä¾ä»¥åæ°æ®åºç¨æ·
bash-4.4# mysql -u root -p1@34qWer
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 8.0.32 MySQL Community Server - GPL
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> CREATE USER 'example'@'%' IDENTIFIED BY '1@34qWer';
Query OK, 0 rows affected (0.04 sec)
mysql> create database if not exists example DEFAULT CHARACTER SET = 'UTF8mb4';
Query OK, 1 row affected (0.02 sec)
mysql> GRANT ALL ON example.* TO 'example'@'%';
Query OK, 0 rows affected (0.01 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)
mysql> use example
4.6. æ§è¡æ°æ®åºè¡¨åå§å
mysql> CREATE TABLE `login_user` (
-> `id` int(11) NOT NULL AUTO_INCREMENT,
-> `user_name` varchar(50) DEFAULT NULL COMMENT '',
-> `nick_name` varchar(200) DEFAULT NULL COMMENT '',
-> `bcrypt_passwd` char(68) DEFAULT NULL COMMENT '',
-> `status` char(1) DEFAULT 'Y' COMMENT '\nY \nL\nD',
-> `create_date` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '',
-> `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
-> PRIMARY KEY (`id`),
-> UNIQUE KEY `idx_user_name` (`user_name`)
-> ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COMMENT='';
Query OK, 0 rows affected, 1 warning (0.06 sec)
# å å¯ä¸²å¯¹åºçé»è®¤å¯ç æ¯123456
mysql> INSERT INTO `login_user` VALUES (1, 'admin', '', '{bcrypt}$2a$10$XMj0iNiUZNf5Dec5QL4.WOVa92tSY6xcRH6SjY.LajLZvVMVxb8Vy', 'Y', '2020-03-22 00:36:54', '2020-03-22 20:20:34');
Query OK, 1 row affected (0.03 sec)
mysql>
- 建表è¯å¥
CREATE TABLE `login_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_name` varchar(50) DEFAULT NULL COMMENT '',
`nick_name` varchar(200) DEFAULT NULL COMMENT '',
`bcrypt_passwd` char(68) DEFAULT NULL COMMENT '',
`status` char(1) DEFAULT 'Y' COMMENT '\nY \nL\nD',
`create_date` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `idx_user_name` (`user_name`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COMMENT='';
4.7. çæå¯ç çæ¹æ³
è°ç¨PasswordToolså¯ä»¥çæå¯ç ï¼å¡«å
¥æ°æ®åºå³å¯
5. 示ä¾é¡¹ç®é¨ç½²æ¹æ³
- 主ç®å½å建configãlogs两个æä»¶å¤¹
- 主ç®å½æ¾ç½®start.shåstop.shä¸¤ä¸ªèæ¬æä»¶ï¼å¹¶æ·»å 坿§è¡æé
- configç®å½ä¸æ¾ç½®application.propertiesæapplication*.ymlålog4j2.xmlæä»¶
- ä¿®æ¹log4j2.xmlæä»¶ï¼å¢å æ¥å¿æä»¶è¾åº
5.1. 示ä¾é¡¹ç®å¯å¨èæ¬start.sh
#!/bin/bash
APP_HOME=$(cd "$(dirname "$0")";pwd)
APP_EXEC_JAR="spring3-security6-jwt-example-0.0.1.SNAPSHOT.jar"
PIDFILE="$APP_HOME/pid"
checkRunning(){
if [ -f "$PIDFILE" ]; then
if [ -z "`cat $PIDFILE`" ];then
echo "ERROR: Pidfile '$PIDFILE' exists but contains no pid"
return 2
fi
PID="`cat $PIDFILE`"
RET="`ps -p $PID|grep java`"
if [ -n "$RET" ];then
return 0;
else
return 1;
fi
else
return 1;
fi
}
if ( checkRunning );then
PID=`cat $PIDFILE`
echo "INFO: Process with pid '$PID' is already running"
exit 0
fi
java -server -Xmx256m -XX:+UseG1GC \
-Dspring.config=$APP_HOME/config/application.properties \
-Dlogging.config=$APP_HOME/config/log4j2.xml \
-DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector \
-jar $APP_HOME/$APP_EXEC_JAR $APP_HOME/config > $APP_HOME/nohup 2>&1 &
echo $! > "$APP_HOME/pid";
5.2. 示ä¾é¡¹ç®åæ¢èæ¬stop.sh
å½åéç¨ç´æ¥killè¿ç¨çæ¹å¼ï¼æªæ¥è®¡åæä¾å®å ¨åæ¢çæ¹æ³
#!/bin/sh
APP_HOME=$(cd "$(dirname "$0")";pwd)
PID=`cat $APP_HOME/pid`
echo "INFO: Sending SIGKILL to process with pid '$PID'"
i=1
while [ "$i" != "3" ]; do
kill -KILL $PID
i=`expr $i + 1`
done
5.3. å®è£
æsystemdæå¡
- å¨
/etc/systemd/systemç®å½ä¸é ç½®spring-jw-example.serviceæä»¶
[Unit]
Description=spring-jw-example
After=syslog.target
[Service]
User=myapp
ExecStart=/var/spring3-security6-jwt-example/start.sh
SuccessExitStatus=143
[Install]
WantedBy=multi-user.target
- é ç½®æèªå¨å¯å¨
systemctl enable spring-jw-example.service
- å¯å¨æå¡
systemctl start spring-jw-example.service
6. åºäºGitLabçCI
åèHow to deploy Maven projects to Artifactory with GitLab CI/CDæ·»å .gitlab-ci.ymlæä»¶ï¼åªåbuildï¼testï¼æä»¥æä»¶é ç½®å¦ä¸
image: maven:latest
stages:
- build
- test
variables:
MAVEN_CLI_OPTS: "-s .m2/settings.xml --batch-mode"
MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository"
cache:
paths:
- .m2/repository/
- target/
build:
stage: build
script:
- mvn $MAVEN_CLI_OPTS compile
test:
stage: test
script:
- mvn $MAVEN_CLI_OPTS test
为äºå émavenä»åºè®¿é®ï¼å¨å·¥ç¨ä¸é
ç½®.m2/settings.xmlæä»¶ï¼å¹¶ä¸å¨è¯¥æä»¶ä¸çä»åºéåé
ç½®é¿éäºmavenå éã
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
7. SpringBoot tomcat æ§è½æµè¯æ åµ
å 说ç»è®ºï¼
- æå¡å¨æä½ç³»ç»
CentOS Linux release 7.6.1810ï¼ä» ä» è°æ´sessionçopenfileè³10ä¸ï¼æªåä»»ä½å ¶ä»åæ°è°æ´ - å®è£
Open JDK11.0.8ï¼Javaè¿ç¨å¯å¨åæ°-server -Xss256k -Xms8g -Xmx8g - æå¡å¨é ç½®ï¼VMWareèæå16vCPUï¼32Gï¼ç¨³å®è¿è¡å¨å¹¶å3000个请æ±/ç§å·¦å³ï¼å½å¤æäººæµè¯ä¸è°æ´ä»»ä½åæ°è½å¤ç¨³å®å¨5000个并å以å
7.1. æµè¯å½ä»¤åå¤
7.2. å®è£ ab testå½ä»¤
[root@node-kubeadm-251 ~]# yum -y install httpd-tools
7.3. åå¤jsonæä»¶
{
"id": "452FFCA6-F394-4AA1-9447-F6B839836F50",
"servId": "E0619A20-7D33-4D48-874F-45C0D9314F5E",
"severName": "æ±ååææå¡åº",
"areaName": "ååº",
"devName": "西åºå¡å£å
¥å£æåæº",
"reportTime": "2017-08-25 11:32",
"plate": "åAK2222",
"plateColor": "é»è²",
"carColor": "红è²",
"leaveOrEnter": "è¿å
¥",
"carSize": "大å车",
"area": "ååº",
"createDate": "2017-08-25 11:35:00"
}
7.4. è°ç¨/api/authenticateè·åtokenåå¼å§æµè¯
[root@node-kubeadm-251 ~]# ab -n300000 -c200 -T application/json -H "Content-Type: application/json" -H "Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsInJvbGVzIjpbXSwiaWF0IjoxNjAwODI0NTI2LCJleHAiOjE2MDA5MTA5MjZ9.mJAB0Z6iEUdtyXBobB0GTvAjLKPCiW9lbIws68nEzZI" -p test_post.json http://127.0.0.1:8080/api/benchmarks/post_dev_info
This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 127.0.0.1 (be patient)
Completed 30000 requests
Completed 60000 requests
Completed 90000 requests
Completed 120000 requests
Completed 150000 requests
Completed 180000 requests
Completed 210000 requests
Completed 240000 requests
Completed 270000 requests
Completed 300000 requests
Finished 300000 requests
Server Software:
Server Hostname: 127.0.0.1
Server Port: 8080
Document Path: /api/benchmarks/post_dev_info
Document Length: 552 bytes
Concurrency Level: 200
Time taken for tests: 90.035 seconds
Complete requests: 300000
Failed requests: 0
Write errors: 0
Total transferred: 278400000 bytes
Total body sent: 239700000
HTML transferred: 165600000 bytes
Requests per second: 3332.05 [#/sec] (mean)
Time per request: 60.023 [ms] (mean)
Time per request: 0.300 [ms] (mean, across all concurrent requests)
Transfer rate: 3019.67 [Kbytes/sec] received
2599.91 kb/s sent
5619.58 kb/s total
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.4 0 17
Processing: 1 60 78.5 45 1317
Waiting: 0 60 78.5 44 1317
Total: 1 60 78.5 45 1317
Percentage of the requests served within a certain time (ms)
50% 45
66% 58
75% 86
80% 96
90% 145
95% 201
98% 289
99% 370
100% 1317 (longest request)