2011-12-19 2 views
1

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

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

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

Вот код Java Applet:

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-код страницы.

ответ

2

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

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

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

+0

Выполнение теста в PHP показал следующие значения: 'имя сеанса: \t PHPSESSID Session ID: \t 917bcaa8e ------------ 329035f0640' ' Cookie: \t 'PHPSESSID': \t ' 917bcaa8e ------------ 329035f0640 ' Cookie: \t' X-Mapping-kjicghkc ': \t' 9EE581364 ------------ 955DBE039A8'' Второй файл cookie X -Mapping-kjicghkc и ключ после него - это тот, который появляется в моем Java-апплете. Должен ли я использовать это или я должен искать только PHPSESSID? – Ozzy

+0

Вам нужны оба взгляда. PHPSESSID из вашего приложения, и я предполагаю, что я читал, что X-Mapping - ???????? от вашего балансировщика нагрузки, но я никогда не видел его лично. – SplinterReality

+0

На самом деле, я просто загрузил свой апплет снова на веб-сервер после использования класса по ссылке, которую вы мне дали ... теперь это работает! Апплет может видеть область участника, просто установив файл cookie. 'cm.setCookies (conn2);' является магией этого класса в ссылке. благодаря :) – Ozzy