PHP中的服务器端重定向

时间:2009-12-30 01:16:58

标签: java .net php server-side

我有一个Java应用程序,我需要将我们现有的PHP网站与之集成。供应商希望我们进行服务器端重定向以允许安全身份验证和单点登录,但我不确定如何在PHP中执行此操作。供应商解释了工作流程如下:

  1. 用户点击PHP网站上的“打开应用程序”链接
  2. PHP应用程序访问Java应用程序上的页面,发送身份验证参数
  3. 如果成功,PHP应用程序会将标头发送回用户的浏览器,这会强制“重定向”,否则PHP应用程序会显示错误
  4. 这将允许我们的PHP应用程序安全地与Java应用程序通信,并且客户端永远不必发送任何类型的身份验证。

    据我所知,.NET和Java内置了这种功能,但我无法在PHP中找到这样做的方法。有任何想法吗?

    更新

    我不是在谈论使用标题(“位置:...”);函数进行重定向。具有此服务器端重定向的踢球者是应用程序执行身份验证并将所有信息发送回客户端,以便客户端随后登录。使用标头(“Location:...”)只是强制浏览器运行别处。

    更新2

    autologin.php(模拟用户通过curl登录外部应用程序)

    // The login 'form' is at login.php
    $ch = curl_init('http://domain.local/login.php');
    // We are posting 2 variables, and returning the transfer just so it doesn't dump out
    // Headers are processed by the callback function processHeaders()
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_HEADERFUNCTION, 'processHeaders');
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, 'username=user&password=pass');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    // Execute curl, close the connection, and redirect the user to a 'restricted' page
    $response   = curl_exec($ch);
    curl_close($ch);
    header("Location: http://domain.local/restricted.php");
    
    function processHeaders($ch, $header) {
        // Dump the response headers to the client
        header($header);
        strlen($header);
    }
    

    login.php(包含'登录'表单)

    session_start();
    if($_POST) {
        if($_POST['username'] == 'user' && $_POST['password'] == 'pass') {
            $_SESSION['auth'] = 1;
            $_SESSION['token'] = md5(time());
        } else {
            echo 'Auth failed';
        }
    } else {
        echo 'Invalid access type';
    }
    

    restricted.php(限制页面)

    session_start();
    if($_SESSION['auth']) {
        echo 'Secret Token: '.$_SESSION['token'];
    } else {
        echo 'Please log in';
    }
    

    这个想法是用户想要最终获得'restricted.php'。 'login.php'包含登录所需的代码。我想模拟的是用户在'login.php'上填写表单并将用户登录到'restricted.php'。

    上面的代码片段在我的本地测试中一起工作(命中autologin.php重定向到restricted.php并且打印出秘密令牌),但我似乎无法让它在跨应用程序中工作。这些应用将位于同一个域中(https://domain.com/myapphttps://domain.com:1234/vendorapp)。

    我以前从未用任何语言做过这件事,我只是关注我的供应商告诉我他们做过的事情。显然他们以前从未处理过PHP,也不知道该怎么做。

4 个答案:

答案 0 :(得分:6)

像这样:

header("Location: http://www.example.com/")

但它必须先于任何其他代码...请参阅php.net

答案 1 :(得分:4)

您只需输出正常的HTTP重定向header(),如下所示:

<?php header('Location: http://www.example.com/'); ?>

重新更新

如果我理解正确,你需要这样做:

  1. 浏览器POST对PHP服务器的登录请求
  2. PHP脚本以JSP应用程序的某种特定形式打包登录信息
  3. PHP脚本POST(通过cURL)或SOAPs或JSP app所需的任何内容
  4. PHP接收响应并解析必要的信息
  5. PHP将标题和/或正文数据发送回浏览器
  6. 步骤4,解析信息取决于您发送和接收信息的方式。如果您通过cURL在标头中收到它们,则需要set CURLOPT_HEADERtrue并从响应中解析出必要的数据。这可能就像在第一个空行上拆分字符串一样简单或更复杂,这取决于您的具体情况。

    如何在您的应用中登录用户,这也是您需要处理的事情。 JSP应用程序可能会处理实际的密码和用户名,并提交您需要跟踪的某种令牌。

答案 2 :(得分:2)

听起来你正在寻找 curl 库,它通常与PHP捆绑在一起。

http://php.net/manual/en/book.curl.php

<?php
session_start();

// Receive username / password from $_POST

// Prepare CURL object for post

// Post u/p to java server

// Read response

if($success)
{
    header('Location: nextpage.php');
    $_SESSION['LoggedInTime'] = time();
    exit;
} 
else
{
    //display error
}

<强>更新

稍后,您可以检查$_SESSION['LoggedInTime'] + 3600 > time()以查看他们是否仍然登录。每次访问登录页面时,请执行以下操作:

if($_SESSION['LoggedInTime'] + 3600 > time()) 
{
     $_SESSION['LoggedInTime'] = time() + 3600;
} 
else
{
     header('Location: /login.php?Message=session+expired');
     exit;
}

希望这有帮助。

答案 3 :(得分:0)

如果您尝试在网络上集成php和java,您可能需要查看Quercus / Resin。然后你的PHP可以直接调用java代码。由于它们在同一台服务器上运行,因此java代码可以编写任何cookie,设置任何会话或进行任何必要的设置处理。 http://www.caucho.com/resin-3.0/quercus/tutorial/module/index.xtp