【问题标题】:How can my java applet use my PHP authenticated session?我的 java 小程序如何使用我的 PHP 认证会话?
【发布时间】:2012-01-23 07:16:21
【问题描述】:

我在我的 PHP 服务器上设置了一个登录区域。 members.php 文件需要登录;我登录后创建一个会话。会话持续一段时间。我想让这个工作,以便当会话仍然有效时,java 小程序应该能够访问 members.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();
         }
     }

}

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

【问题讨论】:

    标签: java php http session applet


    【解决方案1】:

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

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

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

    【讨论】:

    • 在 PHP 中进行测试显示了这些值:Session name: PHPSESSID Session ID: 917bcaa8e------------329035f0640Cookie: 'PHPSESSID': '917bcaa8e------------329035f0640' Cookie: 'X-Mapping-kjicghkc': '9EE581364------------955DBE039A8' 第二个 cookie X-Mapping-kjicghkc 和它之后的键,是我的 Java Applet 中出现的那个。我应该使用它还是应该只寻找 PHPSESSID?
    • 从外观上看,两者都需要。 PHPSESSID 来自您的应用程序,我假设从我读过的 X-Mapping-????????来自您的负载均衡器,但我个人从未见过后者。
    • 实际上,在使用了您提供给我的链接中的课程后,我刚刚将我的小程序再次上传到了 Web 服务器……现在它可以工作了!小程序只需设置cookie就可以看到会员区。 cm.setCookies(conn2); 是链接中该课程的魔力。谢谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 1970-01-01
    • 2012-07-27
    • 2011-04-27
    • 2010-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多