繁体   English   中英

获取 HttpSession|来自简单 java class 而非 servlet class 的请求

[英]get HttpSession|Request from simple java class not servlet class

我想要 session Object 不在 servlet class 中,但在我们的应用程序中是普通的。

WEB.XML

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

查看价格。java

public class ViewPrices implements Cloneable, Serializable {

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

称之为:

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>

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

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

您必须获取请求的选项,以及从中获取请求的选项 - 非 servlet class 中的 session,它仍在 web 层中:

  • 将请求存储在Filter中的ThreadLocal中(然后清理它)
  • 将其作为参数传递 - 在构造函数中(如果在每个请求上实例化 object)或作为方法参数。

我认为不可能直接访问 session 并请求 object。 What you can do is pass the session and/or request object from servlet to a Java class either in some method or in constructor of the Java class.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM