Как мой Java-апплет может использовать мой сеанс аутентификации PHP? - PullRequest
1 голос
/ 19 декабря 2011

Я установил область входа на мой сервер PHP.Файл members.php требует входа в систему;после того, как я войду в систему, сессия будет создана.Сеанс длится некоторое время.Я хочу, чтобы это работало так, чтобы, хотя сеанс все еще действителен, java-апплет мог иметь доступ к странице members.php.

Я встроил Java-апплет в страницу members.php.Он отправляет запрос HttpURLConnection, однако, когда я получаю ответ, я обнаруживаю, что он был перенаправлен сервером PHP на страницу входа в систему.

Как правильно настроить это?

Вот код Java-апплета:

import java.applet.Applet;
import java.awt.Dimension;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.List;
import java.util.Map;

import javax.swing.JFrame;
import javax.swing.JTextArea;

public class phpConnectApplet extends Applet {

    private static final long serialVersionUID = 1L;

     public void init() {
         URL url = null;
         try {
             url = new URL("http://www.example.com/members.php");
             URLConnection urlConn = url.openConnection();
             HttpURLConnection httpConn = (HttpURLConnection) urlConn;
             httpConn.setDoOutput(true);
             httpConn.setDoInput(true);
             httpConn.setUseCaches(false);
             httpConn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
             DataOutputStream output = new DataOutputStream(httpConn.getOutputStream());
             String content = "action=blah"; //just to test the PHP file
             output.writeBytes(content);
             output.flush();
             output.close();

             DataInputStream in = new DataInputStream(urlConn.getInputStream());
             BufferedReader input = new BufferedReader(new InputStreamReader(in));
             String str, result = "";
             while ((str = input.readLine()) != null) {
                 result = result + str + "\n";
             }
             input.close();

             Map<String, List<String>> headers = httpConn.getHeaderFields(); 
             List<String> values = headers.get("Set-Cookie");
             String cookieValue = null; 
             for (String v:values) {
                  if (cookieValue == null)
                       cookieValue = v;
                   else
                       cookieValue = cookieValue + ";" + v;
             }
             System.out.println(cookieValue);

             JFrame f = new JFrame("App Title");
             f.add(new JTextArea(result));
             f.setMaximumSize(new Dimension(400,300));
             f.pack();
             f.setLocationRelativeTo(null);
             f.setVisible(true);
         } catch (MalformedURLException me) {
             me.printStackTrace();
         } catch(IOException ie) {
             ie.printStackTrace();
         } catch(Exception e) {
             e.printStackTrace();
         }
     }

}

Выходные данные для этого - JFrame с одним JTextField, который содержит выходной HTML-код страницы входа в систему.

1 Ответ

2 голосов
/ 19 декабря 2011

Вам необходимо зафиксировать значение вашего файла cookie PHPSESSID (или того, что вы используете в качестве имени файла cookie) и добавить его к запросу в HttpURLConnection.Это МОЖЕТ указываться как системный параметр, но если нет, вы можете встроить идентификатор сеанса в качестве атрибута апплета на страницу запуска апплета.(Я не экспериментировал с этой частью специально)

Вот учебник, который объясняет, как отправлять куки в классе URLConnection: http://www.hccp.org/java-net-cookie-how-to.html

В частности, смотрите раздел под названием Установказначение cookie в запросе .

...