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

Rav*_*ekh 6 java jsp servlets java-ee

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

WEB.XML

<listener>
        <listener-class>com.abc.web.ApplicationManager</listener-class>
</listener>
<listener>
        <listener-class>com.abc.web.SessionManager</listener-class>
</listener>
Run Code Online (Sandbox Code Playgroud)

ViewPrices.java

public class ViewPrices implements Cloneable, Serializable {

 Session session = request.getSession();
                   servletContext.getSession()
                   anyWay.getSession();
}
Run Code Online (Sandbox Code Playgroud)

Mat*_*mes 16

叫这个:

RequestFilter.getSession();
RequestFilter.getRequest();
Run Code Online (Sandbox Code Playgroud)

在自定义过滤器上:

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() {
    }
}
Run Code Online (Sandbox Code Playgroud)

您将其注册到您的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>
Run Code Online (Sandbox Code Playgroud)


Boz*_*zho 7

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

service.doSomeBusinessLogic(
     session.getAttribute("currentUser"), 
     session.getAttribute("foo"));
Run Code Online (Sandbox Code Playgroud)

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

  • 将请求存储在a ThreadLocalFilter(并在之后清理它)
  • 将它作为参数传递 - 在构造函数中(如果对象在每个请求上实例化)或作为方法参数.

  • 传递感兴趣的信息(因而不是会话本身!)绝对是最好的方式. (4认同)

Har*_*Joy 1

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