2013-04-03 2 views
0

Я устанавливаю объект сеанса в классе TestAction, и когда я пытаюсь получить объект session в TestServlet, он возвращает null. Любой, пожалуйста, расскажите, как передать сеанс из класса действия в сервлет в структуре Seam.Пропустить значения сеанса от действия до сервлета в структуре шва

@Scope(ScopeType.EVENT) 
@Name("testAction ") 
public class TestAction { 

    public void setSessionObj(){ 

     FacesContext facesContext = FacesContext.getCurrentInstance(); 
     HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(false); 
     session.setAttribute("temp", "124563"); 
    } 
} 

// Servlet начинается здесь

public class TestServlet extends HttpServlet { 

     public void init(ServletConfig servletConfig) throws ServletException { 
      super.init(servletConfig); 
      servletContext = servletConfig.getServletContext(); 

     } 

     protected String doExecute(HttpServletRequest request, 
       HttpServletResponse response) throws Exception { 

       Session session = request.getSession(false); 
      String user1 = (String) session .getAttribute("temp"); 
     } 
    } 

Ниже приводится наблюдение на отладку сессии экземпляры

Я проверил экземпляр объекта сеанса в случае чего я получаю в действии и сервлета, они оба являются разными экземплярами Сессии. Для, например, экземпляр в действии StandardSession [41CBDED6EBBBECEBA001A70555F51CA5] и то, что им получать в сервлета StandardSession [EACBDED6E34BECEB3401A70555F51CA5] Любая причина, почему я получаю разные экземпляры сессии

+0

Как насчет request.getSession()? –

+0

Как именно вы вызываете сервлет? – BalusC

ответ

1

Там не должно быть никакой необходимости получить доступ к сеансу атрибутов через FacesContext в вашем сервлете. Просто используйте request.getSession(), чтобы получить сеанс. Пока ваши запросы на самом деле происходят с одного сеанса, атрибуты сеанса должны быть доступны в сервлет.

+0

Я пробовал использовать request.getSession также, он дает мне null, когда я проверяю имя объекта в случае, когда я получаю действие и сервлет, они оба являются разными экземплярами Session. Например, например, в действии экземпляр StandardSession [41CBDED6EBBBECEBA001A70555F51CA5] и что im, получающий в сервлет, является стандартным (EACBDED6E34BECEB3401A70555F51CA5) –

+0

Если у них разные идентификаторы сеанса, то они не являются тем же самым сеансом, и, следовательно, они не смогут видеть друг друга в сеансе атрибуты, независимо от того, что вы пытаетесь. – NilsH

+0

Да, в этом проблема, у меня есть, почему у них разные идентификаторы сеанса, когда запросы сделаны на одном сеансе –

-2

Я бы использовал прокси-объект, который вводится через CDI/Spring в управляемый компонент JSF и сервлет.

В этом примере создается CDI Bean, который сохраняется в течение всего времени и просто хранит String. Взаимодействие с зависимой втулкой оба компонента могут получить к нему доступ.

Создайте пустой файл bean.xml под папку META-INF ресурсов

@Named 
@ApplicationScoped 
public class Container{ 
private String temp; 

public Container(){ 

} 
public void setTemp(String temp) { 
    this.temp = temp; 
} 

public String getTemp() { 
    return temp; 
} 
} 

@Scope(ScopeType.EVENT) 
@Name("testAction ") 
public class TestAction { 

@Inject 
Container container; 

public void setSessionObj(){ 
container.setTemp("123456"); 

} 
} 

// Servlet начинается здесь

public class TestServlet extends HttpServlet { 

@Inject 
Container container; 
    public void init(ServletConfig servletConfig) throws ServletException { 
     super.init(servletConfig); 
     servletContext = servletConfig.getServletContext(); 

    } 

    protected String doExecute(HttpServletRequest request, 
      HttpServletResponse response) throws Exception { 

      Session session = request.getSession(false); 
     String user1 = container.getTemp(); 
    } 
} 
+0

, пожалуйста, укажите примерный пример –

+1

Плохой совет. Это будет доступно всем ** посетителям/пользователям приложения **. – BalusC