Struts setSesssion() не работает

Я пытаюсь поместить атрибуты в сеанс из моего класса действий

public String execute()  {
    String result = Action.SUCCESS;

    if (username.equals("pavan") && password.equals("kumar")){
        System.out.println("Success");
        Map<String, Object> session = new HashMap<String, Object>();
        session.put("username", username);
        session.put("role", 1);
        ActionContext.getContext().setSession(session);
        return Action.SUCCESS;
    }
    else{
        System.out.println("Input");
        return Action.INPUT;    

    }
}

Успех будет возвращен, когда имя пользователя и пароль будут действительными и перейдут к соответствующему JSP. но атрибуты сеанса, которые я установил, не видны в jsp

<% if(session == null || session.getAttribute("username") == null) {
System.out.println("No valid session found");
response.sendRedirect("/Test/index.jsp");
}%>

Вышеприведенный код - это jsp, который будет перенаправлен на index.jsp, а "No valid session found" будет напечатан в консоли.

Что мне не хватает?


person pavan kumar    schedule 07.09.2014    source источник
comment
Стоит прочитать: stackoverflow.com/a/19540712/1654265   -  person Andrea Ligios    schedule 08.09.2014
comment
Используйте интерфейс SessionAware вместо контекстных методов; он более гибкий, когда дело доходит до изолированного тестирования действий.   -  person Dave Newton    schedule 08.09.2014
comment
Спасибо, Дэйв, я использую SessionAware :)   -  person pavan kumar    schedule 11.09.2014


Ответы (1)


Вам не хватает session, это другой объект в обоих случаях. Вам не нужно использовать скриптлеты в коде. Если вы хотите поместить что-то в сеанс, вы должны получить карту сеанса из контекста действия.

Map<String, Object> session = ActionContext.getContext().getSession();
session.put("username", username);
session.put("role", 1);
return Action.SUCCESS;

или использовать сеанс сервлета напрямую

HttpSession session = ServletActionContext.getRequest().getSession(); 
session.setAttribute("username", username);
session.setAttribute("role", 1);
return Action.SUCCESS;

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

person Roman C    schedule 07.09.2014
comment
Я использую SessionAware, и он работает нормально, а до этого я использовал ваше первое решение, и все было в порядке. Но не могли бы вы уточнить, что actionContext.setSession() не работает. - person pavan kumar; 11.09.2014
comment
Когда вы перенаправляете, диспетчер создает новый контекст действия и устанавливает новую карту сеанса. HashMap не имеет области сеанса для записей, которые вы туда помещаете. В качестве альтернативы можно использовать SessionMap или реализовать стратегию масштаба, как в этом ответе. - person Roman C; 11.09.2014