В вашем первом вопросе: это означает, что если существует связь между типом параметра и типом возвращаемого метода, то используйте общий.
Например:
public <T> T giveMeMaximum(Collection<T> items);
public <T> Collection<T> applyFilter(Collection<T> items);
Здесь вы извлекаете часть Т, следуя определенным критериям. Если T Long
, ваши методы вернут Long
и Collection<Long>
; фактический тип возврата зависит от типа параметра, поэтому полезно и рекомендуется использовать общие типы.
Если это не так, вы можете использовать типы диких карт:
public int count(Collection<?> items);
public boolean containsDuplicate(Collection<?> items);
В этом двух примерах, независимо от типа элементов в коллекциях, типами возврата будут int
и boolean
.
В ваших примерах:
interface Collection<E> {
public boolean containsAll(Collection<?> c);
public boolean addAll(Collection<? extends E> c);
}
эти две функции возвращают логическое значение всех типов элементов в коллекциях. Во втором случае он ограничен экземплярами подкласса E.
Второй вопрос:
class Collections {
public static <T> void copy(List<T> dest, List<? extends T> src) {
...
}
Этот первый код позволяет вам передавать гетерогенный List<? extends T> src
в качестве параметра , Этот список может содержать несколько элементов разных классов, если все они расширяют базовый класс T.
, если у вас есть:
interface Fruit{}
и
class Apple implements Fruit{}
class Pear implements Fruit{}
class Tomato implements Fruit{}
вы могли бы сделать
List<? extends Fruit> basket = new ArrayList<? extends Fruit>();
basket.add(new Apple());
basket.add(new Pear());
basket.add(new Tomato());
List<Fruit> fridge = new ArrayList<Fruit>();
Collections.copy(fridge, basket);// works
С другой стороны,
class Collections {
public static <T, S extends T> void copy(List<T> dest, List<S> src) {
...
}
ограничивают List<S> src
одним классом S, который является подклассом T. Список может содержат только элементы одного класса (в данном случае S) и другого класса, даже если они также реализуют T. Вы не сможете использовать мой предыдущий пример, но вы могли бы сделать:
List<Apple> basket = new ArrayList<Apple>();
basket.add(new Apple());
basket.add(new Apple());
basket.add(new Apple());
List<Fruit> fridge = new ArrayList<Fruit>();
Collections.copy(fridge, basket); /* works since the basket is defined as a List of apples and not a list of some fruits. */
Сессия начинается каждый раз, когда новый пользователь посещает веб-сайт, независимо от того, являются ли они анонимными. Аутентификация имеет очень мало общего с Session.
Тайм-аут аутентификации - это время, в течение которого куки-файл аутентификации подходит для браузера пользователя. По истечении срока действия файлов cookie они должны пройти повторную аутентификацию для доступа к защищенным ресурсам на сайте.
Таким образом, если время сеанса истекает до файла cookie проверки подлинности - они все еще проходят проверку подлинности, но все их переменные сеанса исчезают и могут вызвать ошибки на вашем веб-сайте, если вы не будете дисциплинированы в проверке нулевых значений и других условий, вызванных отсутствием сеанса. .
Если время аутентификации истекает до начала сеанса, все переменные сеанса все еще будут существовать, но они не смогут получить доступ к защищенным ресурсам, пока не войдут снова.
Время ожидания сеанса должно быть меньше времени ожидания FormsAuthentication. Поскольку сеанс может быть удален по причине, и сценарий не будет работать.
Если время сеанса истекло, проверьте FormsAuthentication Ticket. Если тикет действителен, а время не истекло, сгенерируйте сеанс заново на странице входа в систему (определяется в файле web.config как параметр LoginUrl в настройках FormsAuthentication).
Если время FormsAuthentication истекает, ASP.NET FormsAuthentication автоматически перенаправляет пользователя на страницу входа, и пользователь должен снова войти в систему.
Не забывайте, что FormsAuthentication автоматически перенаправляет пользователя на страницу входа в систему по истечении времени ожидания билета.
На самом деле я предпочитаю эту структуру:
в Page_Init в BasePage.cs проверить сеанс. Если сессия истекла; перенаправить пользователя на страницу входа.
if (Session ["UserId"] == null) Response.Redirect ("Login.aspx", true);
При Page_Load в Login.aspx проверьте Session и FormsAuthentication Время билета правильно.
//User already have a session; redirect user to homepage.
if (SessionHandler.UserId != 0)
Response.Redirect("HomePage.aspx");
else
{
//Session is killed; check Ticket is Valid or not
if (Context.User.Identity != null && Context.User.Identity.IsAuthenticated)
{
//Use Value of the FormsAuthentication
var customDataToCheck = Context.User.Identity.Name;
//Use value to check user is exist really and check db for user's session
var user = CheckUserData(customDataToCheck);
if (user != null)
{
//Start Session here
SessionHandler.StartSession(user);
//Redirect user to page what you want.
Response.Redirect("HomePage.aspx?ref=regenerated_session");
}
}
}
на Login.aspx используют FormsAuthentication для создания файлов cookie.
if (username == "testuser" & amp; & password == "testpassword") {// Данные пользователя будут записаны в файл cookie, сохраните данные пользователя, которые вы можете проверить, является ли пользователь действительным или нет (например, Имя пользователя или Идентификатор пользователя).
System.Web.Security.FormsAuthentication.SetAuthCookie ("testUserData", keepMeSignedInCheckBox.Checked); Response.Redirect ( "HomePage.aspx"); }
Как и ожидалось.
E.G. Если ваш сеанс времена после 20 минут, ваши сеансы-переменные будут потеряны. Но пользователь может получить доступ к страницам, которые защищены аутентификацией.
Если время аутентификации, пользователь не мог получить доступ к странице, который он защищает, а состояние сеанса не имеет значения.