从命令行使用 curl 时会话死亡
Session dying when using curl from command line
我使用 sparkjava 开发了一个简单的 java 网络应用程序。它字段 GET 和 POST 请求。我制作了自己的简单身份验证脚本,它使用秘密密码对用户进行身份验证并将用户名存储在会话中:
/*
Make sure authenticated
*/
before((req, res) -> {
boolean authenticated = false;
if ( req.session().attribute("user") != "casumo_user" ) {
try{
if (req.queryParams("secret").equals(System.getenv().get("SECRET"))){
authenticated = true;
req.session().attribute("user","casumo_user");
}
}catch (Exception e){
halt(401, "{\"error\":\"Please Authenticate.\"}");
}
}else{
authenticated = true;
}
if (!authenticated) {
halt(401, "{\"error\":\"Please Authenticate.\"}");
}
});
我使用的是 Postman Add-on for Chrome,它运行良好。我会验证一次,服务器会为后续请求保持我的会话有效。
问题是我想使用 curl 发出相同的请求,但是从一个请求到另一个请求,会话没有保持活动状态。
例如,首先我使用这个命令:
curl -s -L --data "secret=secret_password" url/auth | jsonpp
{ "msg": "Authenticated! You can now make requests." }
但是随后发出 GET 请求证明会话未保留/
curl -s -L url/films | jsonpp
{ "error": "Please Authenticate." }
使用 Postman 应用程序可以让我在验证 1 次后的相当长一段时间内发出 GET 和 POST 请求。是否可以像我在这里那样使用命令行中的 curl 来执行此操作?还是我的身份验证系统不够强大,无法从命令行使用 curl?
谢谢!
如果您希望 curl
在调用之间存储 cookie,您需要告诉它这样做。
查看 --cookie
和 --cookie-jar
选项。
curl --cookie-jar cookies.txt -s -L --data "secret=secret_password"
# then
curl --cookie cookies.txt --cookie-jar cookies.txt -s -L url/films
--cookie-jar
选项告诉 curl 在请求结束时将它收到的任何 cookie 写入文件,--cookie
选项指示它从该文件读取 cookie 以发出请求。
这应该允许您登录,然后在后续请求中使用 cookie 重新建立会话。
curl --help
和man curl
是你的朋友!
补充出色的@drew010 答案,如果您需要阅读和(也)write/update cookie,您还可以同时使用 --cookie
和 --cookie-jar
。
使用 cURL 的 bash 脚本示例,读取和写入 cookie,并将它们存储在 /temp
文件夹中(以保持本地文件夹清洁):
#!/bin/bash
echo "## SUBMITTING..."; sleep 0.5;
echo "## SERVER RESPONSE:";
echo ""; sleep 0.5;
curl -X GET \
http://localhost:8080/web-service/path \
--cookie /tmp/cookie.txt \
--cookie-jar /tmp/cookie.txt \
-H 'Accept: */*' \
-H 'Cache-Control: no-cache' \
-H 'Connection: keep-alive' \
-H 'Content-Type: application/json' \
echo "";
echo "";
我使用 sparkjava 开发了一个简单的 java 网络应用程序。它字段 GET 和 POST 请求。我制作了自己的简单身份验证脚本,它使用秘密密码对用户进行身份验证并将用户名存储在会话中:
/*
Make sure authenticated
*/
before((req, res) -> {
boolean authenticated = false;
if ( req.session().attribute("user") != "casumo_user" ) {
try{
if (req.queryParams("secret").equals(System.getenv().get("SECRET"))){
authenticated = true;
req.session().attribute("user","casumo_user");
}
}catch (Exception e){
halt(401, "{\"error\":\"Please Authenticate.\"}");
}
}else{
authenticated = true;
}
if (!authenticated) {
halt(401, "{\"error\":\"Please Authenticate.\"}");
}
});
我使用的是 Postman Add-on for Chrome,它运行良好。我会验证一次,服务器会为后续请求保持我的会话有效。
问题是我想使用 curl 发出相同的请求,但是从一个请求到另一个请求,会话没有保持活动状态。
例如,首先我使用这个命令:
curl -s -L --data "secret=secret_password" url/auth | jsonpp
{ "msg": "Authenticated! You can now make requests." }
但是随后发出 GET 请求证明会话未保留/
curl -s -L url/films | jsonpp
{ "error": "Please Authenticate." }
使用 Postman 应用程序可以让我在验证 1 次后的相当长一段时间内发出 GET 和 POST 请求。是否可以像我在这里那样使用命令行中的 curl 来执行此操作?还是我的身份验证系统不够强大,无法从命令行使用 curl?
谢谢!
如果您希望 curl
在调用之间存储 cookie,您需要告诉它这样做。
查看 --cookie
和 --cookie-jar
选项。
curl --cookie-jar cookies.txt -s -L --data "secret=secret_password"
# then
curl --cookie cookies.txt --cookie-jar cookies.txt -s -L url/films
--cookie-jar
选项告诉 curl 在请求结束时将它收到的任何 cookie 写入文件,--cookie
选项指示它从该文件读取 cookie 以发出请求。
这应该允许您登录,然后在后续请求中使用 cookie 重新建立会话。
curl --help
和man curl
是你的朋友!
补充出色的@drew010 答案,如果您需要阅读和(也)write/update cookie,您还可以同时使用 --cookie
和 --cookie-jar
。
使用 cURL 的 bash 脚本示例,读取和写入 cookie,并将它们存储在 /temp
文件夹中(以保持本地文件夹清洁):
#!/bin/bash
echo "## SUBMITTING..."; sleep 0.5;
echo "## SERVER RESPONSE:";
echo ""; sleep 0.5;
curl -X GET \
http://localhost:8080/web-service/path \
--cookie /tmp/cookie.txt \
--cookie-jar /tmp/cookie.txt \
-H 'Accept: */*' \
-H 'Cache-Control: no-cache' \
-H 'Connection: keep-alive' \
-H 'Content-Type: application/json' \
echo "";
echo "";