从简单的java类获取HttpSession | Request而不是servlet类

我希望会话对象不在servlet类中,而是普通的应用程序。

WEB.XML

 com.abc.web.ApplicationManager   com.abc.web.SessionManager  

ViewPrices.java

 public class ViewPrices implements Cloneable, Serializable { Session session = request.getSession(); servletContext.getSession() anyWay.getSession(); } 

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

这个叫:

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

在自定义filter上:

 public class RequestFilter implements Filter { private static ThreadLocal localRequest = new ThreadLocal(); 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文件中:

  RequestFilter your.package.RequestFilter   RequestFilter /*  

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

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

您必须获取请求的选项,以及仍在Web层中的非servlet类中的会话:

  • 将请求存储在Filter中的ThreadLocal中(并在之后清除它)
  • 将它作为参数传递 – 在构造函数中(如果对象在每个请求上实例化)或作为方法参数。