Как использовать переменную области приложения в пользовательском перехватчике?

Я получаю NullPointerException при доступе к карте приложения, которая должна была быть внедрена в Interceptor, так как я реализовал интерфейс ApplicationAware.

public String intercept(ActionInvocation ai) throws Exception {
    String result = "expire";
    app.put("login_msg", "Session Expired");
    Map session = ai.getInvocationContext().getSession();

    try {
        if ((session != null && session.get("login").toString().equalsIgnoreCase("true")) || !app.get("db_name").toString().equals("")) {
        log.info("login hai");
        app.put("login_msg", "");
        result = ai.invoke();
        } else {
            log.error(" LOGIN EXPIRED ");
        }
    } catch (NullPointerException npe) {
        log.error("Error : " + npe);
    }

    log.info("Interceptor Result : " + result);
    return result;
}

@Override
public void setApplication(Map<String, Object> map) {
    app = map;
}

person Harshdeep Singh    schedule 25.07.2016    source источник
comment
То, что вы (пытаетесь) поместить строку, которая явно говорит о сеансе, как в сеансе входа в систему, во что-то, явно называемое приложением, должно быть огромным красным предупреждающим флагом о том, что что-то могло пойти не так в процессе мышления.   -  person Dave Newton    schedule 25.07.2016
comment
@HarshdeepSingh Это уже другой вопрос.   -  person Roman C    schedule 25.07.2016


Ответы (1)


ApplicationAware — это используемый интерфейс чтобы внедрить глобальную карту в действия, а не в перехватчики:

Действия, которые хотят знать об объекте карты приложения, должны реализовывать этот интерфейс. Это даст им доступ к карте, где они могут размещать объекты, которые должны быть доступны для других частей приложения.

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

person Andrea Ligios    schedule 25.07.2016
comment
У тебя все еще есть сомнения @harshdeep? - person Andrea Ligios; 25.07.2016
comment
Спасибо за этого дружище! Я использовал только сеанс, но все еще не смог напечатать сообщение (которое было установлено в перехватчике) на страницу jsp, где оно было перенаправлено. На самом деле это проверка сеанса входа в систему, и если срок действия сеанса истек, он перенаправит его на страницу входа. Я хочу напечатать сообщение об истечении срока действия сеанса на этой странице. Пожалуйста помоги. - person Harshdeep Singh; 26.07.2016
comment
Звучит как новый вопрос, кстати, <s:property value="#session.foo" /> напечатает значение foo. - person Andrea Ligios; 26.07.2016
comment
Хм... этот перехватчик для проверки сеанса погоды был уничтожен или нет, и если сеанс уничтожен, он перенаправит на страницу входа. Поскольку сеанс истек, переменная #session будет равна нулю. - person Harshdeep Singh; 26.07.2016
comment
Нет. #session – это Map‹String,Object›, созданный Struts2 на основе базового HttpSession.getAttributes, и он никогда не будет быть нулевым. Он будет содержать значение, если пользователь успешно вошел в систему и срок действия сеанса не истек, в противном случае он не будет содержать значение. - person Andrea Ligios; 26.07.2016
comment
Также прочитайте это (с вопросом тоже) stackoverflow.com/a/27702918/1654265 - person Andrea Ligios; 26.07.2016