Различия в тайм-ауте автора форм и тайм-ауте сессии

В вашем первом вопросе: это означает, что если существует связь между типом параметра и типом возвращаемого метода, то используйте общий.

Например:

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. */
26
задан Greg 1 February 2010 в 16:34
поделиться

3 ответа

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

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

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

Если время аутентификации истекает до начала сеанса, все переменные сеанса все еще будут существовать, но они не смогут получить доступ к защищенным ресурсам, пока не войдут снова.

58
ответ дан womp 15 October 2019 в 07:49
поделиться

Время ожидания сеанса должно быть меньше времени ожидания FormsAuthentication. Поскольку сеанс может быть удален по причине, и сценарий не будет работать.

Если время сеанса истекло, проверьте FormsAuthentication Ticket. Если тикет действителен, а время не истекло, сгенерируйте сеанс заново на странице входа в систему (определяется в файле web.config как параметр LoginUrl в настройках FormsAuthentication).

Если время FormsAuthentication истекает, ASP.NET FormsAuthentication автоматически перенаправляет пользователя на страницу входа, и пользователь должен снова войти в систему.

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

На самом деле я предпочитаю эту структуру:

  1. Создайте BasePage.cs для страниц входа в систему.
  2. в Page_Init в BasePage.cs проверить сеанс. Если сессия истекла; перенаправить пользователя на страницу входа.

    if (Session ["UserId"] == null) Response.Redirect ("Login.aspx", true);

  3. При 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");
                }                    
            }
        }
    
  4. на Login.aspx используют FormsAuthentication для создания файлов cookie.

    if (username == "testuser" & amp; & password == "testpassword") {// Данные пользователя будут записаны в файл cookie, сохраните данные пользователя, которые вы можете проверить, является ли пользователь действительным или нет (например, Имя пользователя или Идентификатор пользователя).
    System.Web.Security.FormsAuthentication.SetAuthCookie ("testUserData", keepMeSignedInCheckBox.Checked); Response.Redirect ( "HomePage.aspx"); }

-3
ответ дан Hakan KOSE 15 October 2019 в 07:49
поделиться

Как и ожидалось.

E.G. Если ваш сеанс времена после 20 минут, ваши сеансы-переменные будут потеряны. Но пользователь может получить доступ к страницам, которые защищены аутентификацией.

Если время аутентификации, пользователь не мог получить доступ к странице, который он защищает, а состояние сеанса не имеет значения.

1
ответ дан 28 November 2019 в 06:53
поделиться
Другие вопросы по тегам:

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