我的java applet如何使用我的PHP认证会话


How can my java applet use my PHP authenticated session?

我已经在PHP服务器上设置了一个登录区。php文件需要登录;在我登录后,创建了一个会话。会议持续一段时间。我想这样做,当会话仍然有效时,java applet应该能够访问members.php页面。

我已经将Java applet嵌入到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();
         }
     }
}

它的输出是一个带有一个JTextField的JFrame,其中包含登录页面的输出HTML。

您需要捕获PHPSESSID cookie的值(或您用于cookie名称的任何值)并将其添加到HttpURLConnection中的请求中。这个可以作为系统参数出现,但如果不是,您可以将会话ID作为applet属性嵌入到启动applet的页面上。(我没有专门试验过这部分)

这里有一个教程,解释了如何在URLConnection类中发送cookie: http://www.hccp.org/java-net-cookie-how-to.html

具体参见在请求中设置cookie值