Перенаправление к предыдущей странице после входа в систему использования PHP

Скажем, я хочу перейти к странице контакта. Но для получения там, сайт требует, чтобы я вошел в систему. После входа в систему я, как предполагается, перенаправляюсь к странице контакта, но я где-то в другом месте. Что я должен сделать таким образом, что я должен быть перенаправлен к странице, которую я хочу после входа в систему?

У меня есть сильное чувство, что это имеет некоторое отношение к сессиям, но тем не менее. Каков подход должен быть?

9
задан Peter Mortensen 1 March 2014 в 09:04
поделиться

3 ответа

Проблема заключается в anArray = [NSMuterArray arrayWeyObjects: @ «один», @ «два», @ «три», nil]; Это заменяет первоначально созданный массив. Проблема в том, что этот новый массив не сохраняется, поэтому он теряется, как только метод возвращается. Кроме того, у вас утечка памяти, потому что вы никогда не освобождали исходный массив.

Существует несколько способов исправить это, но одним из них является использование [anArray release]; anArray = [[NSMuterArray arrayWeyObjects: @ «один», @ «два», @ «три», nil] сохранить]; .

Другим, возможно, более правильным способом исправления является использование методов addObject: или addObjects StartArray: NSMuterArray вместо постоянного создания новых массивов.

-121--4154780-

Другой подход заключается в том, чтобы принять, что «уродливая часть» должна быть где-то реализована, и предоставить абстракцию, которая скрывает «уродливую часть», так что вам не придется повторять ее в нескольких местах и может сосредоточиться на конкретном алгоритме. Это можно сделать с помощью лямбда-выражений C # (или с помощью анонимных делегатов C # 2,0, если используется только .NET 2,0):

void ForEachWithFirst<T>(IEnumerable<T> en, 
     Action<T> firstRun, Action<T> nextRun) {
  bool first = true;
  foreach(var e in en) {
    if (first) { first = false; firstRun(e); } else nextRun(e);
  }
}

Теперь можно использовать этот метод многократного использования для реализации алгоритма следующим образом:

ForEachWithFirst(websitePages,
  (wp => sb.AppendLine(String.Format("<li class=\"first\">" +
         "<a href=\"{0}\">{1}</a></li>", wp.GetFileName(), wp.Title)))
  (wp => sb.AppendLine(String.Format("<li>" + 
         "<a href=\"{0}\">{1}</a></li>", wp.GetFileName(), wp.Title))) );

Абстракцию можно разработать по-разному в зависимости от точного повторяющегося образца. Хорошо то, что - благодаря лямбда-выражению - структура абстракции полностью зависит от вас.

-121--1609768-

Я склонен перенаправлять на страницу входа, передавая текущий URL в последовательности запроса.

Страница для защиты

session_start();

if (!isset($_SESSION['user_id']))
{
    // Fetch current URL
    $this_url = $_SERVER['REQUEST_URI'];

    // Redirect to login page passing current URL
    header('Location: login.php?return_url=' . urlencode($this_url));
    exit;
}

// Continue processing
echo 'Hello from this page';

Страница входа в систему

session_start();

// Simulate logging in user
$_SESSION['user_id'] = 1;

// Fetch URL to redirect to
$return_url = isset($_GET['return_url']) ? $_GET['return_url'] : 'site_home.php';

// Redirect back
header('Location: ' . $return_url); 

В коде выше я просто имитирую процесс входа в систему. Как правило, пользователь должен представить свои полномочия в форме, проверить учетные данные и войти в систему. Этот процесс должен поддерживать URL-адрес страницы, на которую необходимо перенаправить назад. Можно продолжить передачу URL-адреса в последовательности запроса или через скрытое поле ввода в форме.

2
ответ дан 4 December 2019 в 13:01
поделиться

У вас есть три общих подхода:

  1. Хранить предыдущую страницу в сессии;
  2. Хранить страницу как GET-переменную; или
  3. Делать внутренний редирект на страницу входа.

(1) выглядит примерно так:

<?php
session_start();
if (!$_SESSION['userid']) {
  $_SESSION['page'] = '/contact';
  header('Location: /login');
  exit;
}
...
?>

При успешном входе в систему извлекаем $_SESSION['page'] и перенаправляем.

(2) выглядит аналогично, за исключением того, что здесь нет переменной сессии. Вместо этого вам нужно:

header('Location: /login?return=/contact');

передать перенаправление. Страница входа в систему должна будет включить его в качестве скрытого поля формы на странице, которая представляет пользователю запрос на имя пользователя и пароль.

(3) аналогичен, но не перенаправляет на отдельную страницу. Вместо этого каждая страница потенциально может быть страницей входа в систему. Если пользователь не вошел в систему, вместо этого будет представлена форма входа. URL по-прежнему будет "/contact". Каждая страница будет обнаруживать и обрабатывать попытки входа в систему.

Преимуществом этого метода является меньшее количество внешних перенаправлений и более простая обработка отправленных форм. Под этим я подразумеваю, что представьте, что кто-то заполняет форму на одной из ваших страниц, а затем нажимает кнопку отправить. Система видит, что срок действия его логина истек. Если вы перенаправите пользователя на новую страницу, а затем вернете обратно, ему, вероятно, придется заново вводить все поля формы. Если вы обрабатываете вход неявно, вы можете включить все поля формы в качестве скрытых входов и после входа в систему без проблем рассматривать это как отправку исходной страницы.

10
ответ дан 4 December 2019 в 13:01
поделиться

Подход, который я обычно использую:

  1. На странице контактов перенаправляйте на страницу входа, если пользователь не вошел в систему.
  2. На странице входа используйте $ _ SERVER ['HTTP_REFERER'] переменную (которая будет установлена ​​на страницу, с которой пришел пользователь, то есть на страницу контактов) и сохраните ее как скрытое поле.
  3. После того, как пользователь войдет в систему, перенаправьте его обратно на страницу, на которой он был.

Прелесть в том, что он автоматически работает для всех страниц, требующих входа в систему, без необходимости устанавливать переменные сеанса на каждой странице.

Одно предостережение: при входе в систему вы должны убедиться, что страница в реферере находится на вашем сайте, а не на совершенно другом сайте, например, на случай, если пользователь пришел из Google.

4
ответ дан 4 December 2019 в 13:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: