php - example - request redirect in jsp
¿PHP tiene un equivalente de RequestDispatcher.forward de Java? (7)
Creo que uno de los métodos análogos más cercanos sería usar la función virtual () mientras ejecuta php como un módulo de apache.
virtual () es una función específica de Apache que es similar a en mod_include. Realiza una sub-solicitud de Apache.
En Java, puedo escribir un JSP index.jsp
realmente básico, así:
<% request.getRequestDispatcher("/home.action").forward(request, response); %>
El efecto de esto es que un usuario que solicita index.jsp
(o solo el directorio que contiene suponiendo que index.jsp
es un documento predeterminado para el directorio) verá home.action
sin una redirección de navegador, es decir, [forward] ( http: // java.sun.com/javaee/5/docs/api/javax/servlet/RequestDispatcher.html#forward(javax.servlet.ServletRequest,%20javax.servlet.ServletResponse)) ocurre en el servidor.
¿Puedo hacer algo similar con PHP? Sospecho que es posible configurar Apache para manejar este caso, pero dado que podría no tener acceso a la configuración de Apache relevante, estaría interesado en una solución que solo dependa de PHP.
El truco acerca de Request.Forward es que le da una nueva solicitud limpia a la acción que desea. Por lo tanto, no tiene residu de la solicitud actual, y por ejemplo, no hay problemas con las secuencias de comandos que dependen de la ecuación java de $ _SERVER [''REQUEST_URI''].
Podrías soltar una clase CURL y escribir una función simple para hacer esto:
<?php
/**
* CURLHandler handles simple HTTP GETs and POSTs via Curl
*
* @author SchizoDuckie
* @version 1.0
* @access public
*/
class CURLHandler
{
/**
* CURLHandler::Get()
*
* Executes a standard GET request via Curl.
* Static function, so that you can use: CurlHandler::Get(''http://www.google.com'');
*
* @param string $url url to get
* @return string HTML output
*/
public static function Get($url)
{
return self::doRequest(''GET'', $url);
}
/**
* CURLHandler::Post()
*
* Executes a standard POST request via Curl.
* Static function, so you can use CurlHandler::Post(''http://www.google.com'', array(''q''=>''belfabriek''));
* If you want to send a File via post (to e.g. PHP''s $_FILES), prefix the value of an item with an @ !
* @param string $url url to post data to
* @param Array $vars Array with key=>value pairs to post.
* @return string HTML output
*/
public static function Post($url, $vars, $auth = false)
{
return self::doRequest(''POST'', $url, $vars, $auth);
}
/**
* CURLHandler::doRequest()
* This is what actually does the request
* <pre>
* - Create Curl handle with curl_init
* - Set options like CURLOPT_URL, CURLOPT_RETURNTRANSFER and CURLOPT_HEADER
* - Set eventual optional options (like CURLOPT_POST and CURLOPT_POSTFIELDS)
* - Call curl_exec on the interface
* - Close the connection
* - Return the result or throw an exception.
* </pre>
* @param mixed $method Request Method (Get/ Post)
* @param mixed $url URI to get or post to
* @param mixed $vars Array of variables (only mandatory in POST requests)
* @return string HTML output
*/
public static function doRequest($method, $url, $vars=array(), $auth = false)
{
$curlInterface = curl_init();
curl_setopt_array ($curlInterface, array(
CURLOPT_URL => $url,
CURLOPT_CONNECTTIMEOUT => 2,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_FOLLOWLOCATION =>1,
CURLOPT_HEADER => 0));
if (strtoupper($method) == ''POST'')
{
curl_setopt_array($curlInterface, array(
CURLOPT_POST => 1,
CURLOPT_POSTFIELDS => http_build_query($vars))
);
}
if($auth !== false)
{
curl_setopt($curlInterface, CURLOPT_USERPWD, $auth[''username''] . ":" . $auth[''password'']);
}
$result = curl_exec ($curlInterface);
curl_close ($curlInterface);
if($result === NULL)
{
throw new Exception(''Curl Request Error: ''.curl_errno($curlInterface) . " - " . curl_error($curlInterface));
}
else
{
return($result);
}
}
}
Simplemente descargue esto en class.CURLHandler.php y puede hacer esto:
por supuesto, usar $ _REQUEST no es realmente seguro (debe verificar $ _SERVER [''REQUEST_METHOD'']) pero entiende el punto.
<?php
include(''class.CURLHandler.php'');
die CURLHandler::doRequest($_SERVER[''REQUEST_METHOD''], ''http://server/myaction'', $_REQUEST);
?>
Por supuesto, CURL no está instalado en todas partes, pero tenemos emuladores de curl PHP nativos para eso.
Además, esto le brinda aún más flexibilidad que Request.Forward ya que también puede capturar y postprocesar la salida.
Puedes usar como:
header ("Location: /path/");
exit;
La salida es necesaria en caso de que se haya enviado alguna salida HTML antes, el encabezado () no funcionará, por lo que debe enviar un nuevo encabezado antes de cualquier salida al navegador.
Si le preocupa la disponibilidad de CURL, puede usar file_get_contents()
y streams. Configurando una función como:
function forward($location, $vars = array())
{
$file =''http://''.$_SERVER[''HTTP_HOST'']
.substr($_SERVER[''REQUEST_URI''],0,strrpos($_SERVER[''REQUEST_URI''], ''/'')+1)
.$location;
if(!empty($vars))
{
$file .="?".http_build_query($vars);
}
$response = file_get_contents($file);
echo $response;
}
Esto solo configura un GET, pero también puedes publicarlo con file_get_contents()
.
Si usa un MVC como lo proporciona Zend Framework, puede cambiar la acción del controlador o incluso saltar entre las acciones del controlador. El método es _ hacia adelante como se describe aquí .
Prueba esto.
function forward($page, $vars = null){
ob_clean();
include($page);
exit;
}
en la página incluida la variable $vars
funcionará como los atributos de la solicitud java
Conceptos Redirigir y avanzar como en Java, también se puede lograr en PHP.
Redirect :: header("Location: redirect.php");
- (URL en la barra de direcciones cambia)
Forward :: include forward.php ;
- (URL sin cambios en la barra de direcciones)
Es manejable con esta y otras lógicas de programación