2011-05-03 2 views
5

я хочу, чтобы сеанс был не в классе сервлета, а в обычном из приложения.получить HttpSession | Запрос от простого класса java, а не сервлета

web.xml

<listener> 
     <listener-class>com.abc.web.ApplicationManager</listener-class> 
</listener> 
<listener> 
     <listener-class>com.abc.web.SessionManager</listener-class> 
</listener> 

ViewPrices.java

public class ViewPrices implements Cloneable, Serializable { 

Session session = request.getSession(); 
        servletContext.getSession() 
        anyWay.getSession(); 
} 

ответ

1

Я не думаю, что это возможно, чтобы получить быстрый доступ к сессии и объект запроса. Что вы можете сделать, это передать сеанс и/или запросить объект из сервлета в Java-класс либо в некотором методе, либо в конструкторе класса Java.

7

Существует несколько способов сделать это, но .. нет. Только ваш веб-слой должен иметь доступ к сеансу. Остальные слои должны получать только параметры из требуемого сеанса. Например:

service.doSomeBusinessLogic(
    session.getAttribute("currentUser"), 
    session.getAttribute("foo")); 

Параметры, которые вы должны получить запрос, и от него - сеанс в классе не-сервлет, который все еще находится в веб-слой:

  • магазин запрос в ThreadLocal в Filter (и очистить его потом)
  • передать его как аргумент - либо в конструкторе (если объект создается при каждом запросе), либо как аргумент метода.
+4

Passing информацию (и, следовательно, не сам сеанс!) - это самый лучший способ. – BalusC

+1

Но как вы устанавливаете вещи в сеансе? – mjaggard

+0

@ mjaggard 'doSomeBusinessLogic' вернет карту для сохранения в сеансе. –

15

называют это:

RequestFilter.getSession(); 
RequestFilter.getRequest(); 

на пользовательском фильтре:

public class RequestFilter implements Filter { 

    private static ThreadLocal<HttpServletRequest> localRequest = new ThreadLocal<HttpServletRequest>(); 


    public static HttpServletRequest getRequest() { 
     return localRequest.get(); 
    } 

    public static HttpSession getSession() { 
     HttpServletRequest request = localRequest.get(); 
     return (request != null) ? request.getSession() : null; 
    } 


    @Override 
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { 
     if (servletRequest instanceof HttpServletRequest) { 
      localRequest.set((HttpServletRequest) servletRequest); 
     } 

     try { 
      filterChain.doFilter(servletRequest, servletResponse); 
     } finally { 
      localRequest.remove(); 
     } 
    } 

    @Override 
    public void init(FilterConfig filterConfig) throws ServletException { 
    } 

    @Override 
    public void destroy() { 
    } 
} 

что вы зарегистрировать его в файле web.xml:

<filter> 
    <filter-name>RequestFilter</filter-name> 
    <filter-class>your.package.RequestFilter</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>RequestFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 
+0

Мне нужно использовать chain.doFilter (запрос, ответ); для дальнейшего процесса B'cause я получаю пустой экран браузера. –

+0

Извините, моя вина (я полностью забыл об этом), я только что ее исправил :) –

+0

-1: not threadsafe. Потоки объединяются контейнером, и вы не правильно освобождаете переменную threadlocal. – BalusC

Смежные вопросы