跨多个HttpURLConnection请求维护登录令牌

时间:2015-08-15 15:29:09

标签: java session login token httpurlconnection

很抱歉问你这个,但我是Java的新手。

我有以下课程:

protected class LoginMethod{
        public LoginMethod() throws MalformedURLException, UnsupportedEncodingException, IOException{
        URL url = new URL("http://example.com/login");
        Map<String,Object> params = new LinkedHashMap<>();
        params.put("username", user);
        params.put("password", password );

        StringBuilder postData = new StringBuilder();
        for (Map.Entry<String,Object> param : params.entrySet()) {
            if (postData.length() != 0) postData.append('&');
            postData.append(URLEncoder.encode(param.getKey(), "UTF-8"));
            postData.append('=');
            postData.append(URLEncoder.encode(String.valueOf(param.getValue()), "UTF-8"));
        }
        byte[] postDataBytes = postData.toString().getBytes("UTF-8");
        try{
            HttpURLConnection conn = (HttpURLConnection)url.openConnection();
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            conn.setRequestProperty("Content-Length", String.valueOf(postDataBytes.length));
            conn.setDoOutput(true);
            conn.getOutputStream().write(postDataBytes);

            Reader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
            for ( int c = in.read(); c != -1; c = in.read() )
                token += String.valueOf((char)c);
            System.out.println(token);
            new LoggedIn();
        }catch(IOException es){
            System.out.println(es);
        }
        } 

    }

这会返回带有一些标记的JSON字符串。 下一堂课:

protected class DoStuff{
        public DoStuff() throws MalformedURLException, UnsupportedEncodingException, IOException, ParseException{
            JSONParser parser = new JSONParser();
            URL url = new URL("http://example.com/DoStuff");
            Map<String,Object> params = new LinkedHashMap<>();

            params.put("Do", "Stuff");
            StringBuilder postData = new StringBuilder();
            for (Map.Entry<String,Object> param : params.entrySet()) {
                if (postData.length() != 0) postData.append('&');
                postData.append(URLEncoder.encode(param.getKey(), "UTF-8"));
                postData.append('=');
                postData.append(URLEncoder.encode(String.valueOf(param.getValue()), "UTF-8"));
            }
            byte[] postDataBytes = postData.toString().getBytes("UTF-8");
                try{
                HttpURLConnection conn = (HttpURLConnection)url.openConnection();
                conn.setRequestMethod("POST");
                conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
                conn.setRequestProperty("Content-Length", String.valueOf(postDataBytes.length));
                conn.setDoOutput(true);
                conn.getOutputStream().write(postDataBytes);

                Reader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
                for ( int c = in.read(); c != -1; c = in.read() )
                    stuff +=(char)c;
                System.out.println(stuff);
                new LogOut();
                }catch(IOException er){
                    System.out.println(er);
                }

        }

    }

这应该返回DoStuff的东西。但是因为我不知道如何在这些类之间保持会话,所以我得到401错误。 我的问题是如何保持这些类之间的会话或如何将它们放入一个支持会话的单个类中,记住它们是由单独的按钮调用的。 谢谢!

1 个答案:

答案 0 :(得分:0)

正确答案如下: 在第二个类中,我们需要json解码收到的令牌并添加

conn.setRequestProperty("Authorization", token);

这很有效。感谢StackOverflow的一切。