Скажем, я хочу перейти к странице контакта. Но для получения там, сайт требует, чтобы я вошел в систему. После входа в систему я, как предполагается, перенаправляюсь к странице контакта, но я где-то в другом месте. Что я должен сделать таким образом, что я должен быть перенаправлен к странице, которую я хочу после входа в систему?
У меня есть сильное чувство, что это имеет некоторое отношение к сессиям, но тем не менее. Каков подход должен быть?
Проблема заключается в anArray = [NSMuterArray arrayWeyObjects: @ «один», @ «два», @ «три», nil];
Это заменяет первоначально созданный массив. Проблема в том, что этот новый массив не сохраняется, поэтому он теряется, как только метод возвращается. Кроме того, у вас утечка памяти, потому что вы никогда не освобождали исходный массив.
Существует несколько способов исправить это, но одним из них является использование [anArray release]; anArray = [[NSMuterArray arrayWeyObjects: @ «один», @ «два», @ «три», nil] сохранить];
.
Другим, возможно, более правильным способом исправления является использование методов addObject:
или addObjects StartArray:
NSMuterArray
вместо постоянного создания новых массивов.
Другой подход заключается в том, чтобы принять, что «уродливая часть» должна быть где-то реализована, и предоставить абстракцию, которая скрывает «уродливую часть», так что вам не придется повторять ее в нескольких местах и может сосредоточиться на конкретном алгоритме. Это можно сделать с помощью лямбда-выражений 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-адреса в последовательности запроса или через скрытое поле ввода в форме.
У вас есть три общих подхода:
(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". Каждая страница будет обнаруживать и обрабатывать попытки входа в систему.
Преимуществом этого метода является меньшее количество внешних перенаправлений и более простая обработка отправленных форм. Под этим я подразумеваю, что представьте, что кто-то заполняет форму на одной из ваших страниц, а затем нажимает кнопку отправить. Система видит, что срок действия его логина истек. Если вы перенаправите пользователя на новую страницу, а затем вернете обратно, ему, вероятно, придется заново вводить все поля формы. Если вы обрабатываете вход неявно, вы можете включить все поля формы в качестве скрытых входов и после входа в систему без проблем рассматривать это как отправку исходной страницы.
Подход, который я обычно использую:
$ _ SERVER ['HTTP_REFERER']
переменную (которая будет установлена на страницу, с которой пришел пользователь, то есть на страницу контактов) и сохраните ее как скрытое поле. Прелесть в том, что он автоматически работает для всех страниц, требующих входа в систему, без необходимости устанавливать переменные сеанса на каждой странице.
Одно предостережение: при входе в систему вы должны убедиться, что страница в реферере находится на вашем сайте, а не на совершенно другом сайте, например, на случай, если пользователь пришел из Google.