2011-05-03 49 views
5

我想会话对象不在servlet类,但从我们的应用程序普通。获取HttpSession |请求从简单的Java类不servlet类

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

我不认为这是可能的,可以直接访问会话和请求对象。你可以做的是将会话和/或请求对象从servlet传递给Java类,无论是在某种方法或Java类的构造函数中。

7

有多种方法可以做到这一点,但..不。只有你的web层应该有权访问会话。其他图层只应从它需要的会话中获取参数。例如:

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

,你必须获得该请求,并从它的选项 - 在非servlet类的会议,这仍然是在网络层:

  • 店请求在ThreadLocalFilter(并在之后清理)
  • 将它作为参数传递 - 无论是在构造函数中(如果对象在每个请求上实例化)还是作为方法参数。
+4

传递的信息(而不是会议本身!)绝对是最好的方式。 – BalusC 2011-05-03 11:26:31

+1

但是你如何在会话中设置事物? – mjaggard 2015-12-29 18:50:01

+0

@ mjaggard'doSomeBusinessLogic'将返回地图以存储回会话。 – 2017-12-08 13:17:17

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(request,response); 进一步处理B'cause我得到空白浏览器屏幕。 – 2011-05-03 10:05:13

+0

对不起,我的错(我完全忘记了),我刚刚纠正它:) – 2011-05-03 10:11:53

+0

-1:不是线程安全。线程由容器合并,并且不能正确释放threadlocal变量。 – BalusC 2011-05-03 11:24:08