我可以在 web.xml中关闭 HttpSession 吗?

2022-08-31 16:08:27

我想完全消除HttpSession - 我可以在web.xml中执行此操作吗?我确信有特定于容器的方法可以做到这一点(当我进行Google搜索时,这就是搜索结果拥挤的原因)。

附言:这是个坏主意吗?我更喜欢完全禁用东西,直到我真正需要它们。


答案 1

我想完全消除HttpSession

您无法完全禁用它。您需要做的就是不要通过Web应用程序代码中的任何一个或任何地方来处理它,并确保你的JSP不会通过设置来隐式地做到这一点。request.getSession()request.getSession(true)<%@page session="false"%>

如果您主要关心的是实际上禁用了 在 幕后使用的 cookie,那么在 Java EE 5 / Servlet 2.5 中,您只能在特定于服务器的 webapp 配置中执行此操作。例如,在Tomcat中,您可以将属性设置为in元素。HttpSessioncookiesfalse<Context>

<Context cookies="false">

另请参阅此 Tomcat 特定文档。这样,会话就不会保留在未被URL重写的后续请求中 - 仅当出于某种原因从请求中获取它时。毕竟,如果你不需要它,只是不要抓住它,那么它根本不会被创建/保留。

或者,如果您已经在使用 Java EE 6 / Servlet 3.0 或更高版本,并且真的想通过 来完成,那么您可以使用 new 元素,如下所示,以将最大期限归零:web.xml<cookie-config>web.xml

<session-config>
    <session-timeout>1</session-timeout>
    <cookie-config>
        <max-age>0</max-age>
    </cookie-config>
</session-config>

如果你想在你的web应用程序中进行硬编码,以便永远不会返回一个(或“空”),那么你需要创建一个过滤器来监听其中的过滤器,用一个HttpServletRequestWrapper实现替换,该实现返回所有方法,或者一个虚拟的自定义实现,它什么都不做,甚至抛出。getSession()HttpSessionHttpSessionurl-pattern/*HttpServletRequestgetSession()nullHttpSessionUnsupportedOperationException

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    chain.doFilter(new HttpServletRequestWrapper((HttpServletRequest) request) {
        @Override
        public HttpSession getSession() {
            return null;
        }
        @Override
        public HttpSession getSession(boolean create) {
            return null;
        }
    }, response);
}

附言:这是个坏主意吗?我更喜欢完全禁用东西,直到我真正需要它们。

如果您不需要它们,请不要使用它们。就这样。真的很:)


答案 2

如果您正在构建无状态高负载应用程序,则可以禁用使用 Cookie 进行会话跟踪,如下所示(非侵入式,可能与容器无关):

<session-config>
    <tracking-mode>URL</tracking-mode>
</session-config>

要强制执行此体系结构决策,请编写如下内容:

public class PreventSessionListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent se) {
    throw new IllegalStateException("Session use is forbidden");
}

@Override
public void sessionDestroyed(HttpSessionEvent se) {
    throw new IllegalStateException("Session use is forbidden");
}
}

并将其添加到Web.xml并修复失败的地方,但有以下例外:

<listener>
    <listener-class>com.ideas.bucketlist.web.PreventSessionListener</listener-class>
</listener>

推荐