如何从ServletContext获取HttpServletRequest?

如何从ServletContext获取HttpServletRequest?,第1张

如何从ServletContext获取HttpServletRequest?

是否可以从ServletContext获取HttpServletRequest?

没有。

ServletContext
代表的应用程序。该应用程序可以涵盖许多会话和请求。但是您无法通过来获取“当前正在运行”的请求或会话
ServletContext
。有关servlet和作用域如何工作的详细信息,可以在以下相关答案中找到:servlet如何工作?实例化,会话,共享变量和多线程

不幸的是,您不清楚在何处需要此解决方案的具体功能要求。您显然可以

ServletContext
在感兴趣的类的实例上以某种方式获得帮助,但没有
HttpServletRequest
HttpServletRequest
无论如何,很难提出一个正确的方法来说明如何在此类实例中进行抓取的答案。像JSF和Spring
MVC这样的体面MVC框架可以通过各种方式来获取
HttpServletRequest
与您想要的任何类中的当前线程相关联的内容。

如果您不使用MVC框架,从而无法使用其功能,则可以

ThreadLocal<T>
通过Servlet过滤器将请求(和响应)存储为当前线程中的值来手动实现。

这是一个启动示例,这种线程本地上下文类的外观如下:

public final class YourContext implements AutoCloseable {    private static ThreadLocal<YourContext> instance = new ThreadLocal<>();    private HttpServletRequest request;    private HttpServletResponse response;    private YourContext(HttpServletRequest request, HttpServletResponse response) {        this.request = request;        this.response = response;    }    public static YourContext create(HttpServletRequest request, HttpServletResponse response) {        YourContext context = new YourContext(request, response);        instance.set(context);        return context;    }    public static YourContext getCurrentInstance() {        return instance.get();    }    @Override        public void close() {        instance.remove();    }    // ... (add methods here which return/delegate the request/response).    }

您可以在servlet过滤器中创建(并关闭!!),如下所示。

@Overridepublic void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException {    HttpServletRequest request = (HttpServletRequest) req;    HttpServletResponse response = (HttpServletResponse) res;    try (YourContext context = YourContext.create(request, response)) {        chain.doFilter(request, response);    }}

请注意,关闭非常重要。否则,线程在完成其工作后将被污染,并将被回收以用于不同的请求甚至是完全不同的目的。如果您还没有使用Java7,因此不能使用上述try-with-resources语句,请使用一个

try-finally
块。

然后,在由相同线程/请求调用的任何工件(即,其他过滤器,任何servlet,由这些工件直接调用的任何bean
/类(间接)等)中,您都可以获取

HttpServletRequest
与当前线程的关联,如下所示:

YourContext context = YourContext.getCurrentInstance();HttpServletRequest request = context.getRequest();// ...

或者,最好根据您要对当前请求执行的 *** 作来创建委托方法,例如获取请求语言环境:

YourContext context = YourContext.getCurrentInstance();Locale requestLocale = context.getRequestLocale();// ...

作为一个真实的例子,JavaEE的MVC框架JSF)通过提供了这种可能性

FacesContext

FacesContext context = FacesContext.getCurrentInstance();Locale requestLocale = context.getExternalContext().getRequestLocale();// ...


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5428978.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-11
下一篇 2022-12-11

发表评论

登录后才能评论

评论列表(0条)

保存