从命令行使用curl时会话死亡

时间:2016-06-23 06:06:07

标签: java session authentication curl spark-java

我使用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":"经过身份验证!您现在可以提出请求。" }

但随后发出后续GET请求证明会话未被保留/

curl -s -L url/films | jsonpp 
  

{"错误":"请进行身份验证。" }

使用Postman应用程序可以让我在验证一次后发出GET和POST请求很长一段时间。是否有可能使用命令行中的curl来执行此操作,就像我在这里一样?或者我的身份验证系统不够强大,无法从命令行使用curl?

谢谢!

The project is on GitHub.

2 个答案:

答案 0 :(得分:4)

如果您希望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 --helpman curl是你的朋友!

答案 1 :(得分:0)

作为出色的@ drew010答案的补充,如果您需要读取和(或)写入/更新cookie,也可以同时使用--cookie--cookie-jar

使用cURL,读写cookie并将其存储在/temp文件夹中(以保持本地文件夹整洁)的bash脚本示例:

#!/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 "";