`
云上太阳
  • 浏览: 131718 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

关于Tomcat如何禁用Session 的探讨

阅读更多

关于Tomcat如何禁用Session 的探讨

                                                                                    ——我一直不太信任自己的记忆力,所以我把它们都写下来

1.Web项目Session什么时候生成

    需要明确一点,访问html文件的时候是不会生成Session的,Session的生成必须调用request.getSession()或者request.getSession(true),request.getSession(false)不会生成Session。JSP文件中默认自动添加<%@ page session="true">表示生成Session,jsp文件其实最后也是生成了Servlet类,添加了前面的配置后也会在Servlet类中调用request.getSession(true)。

    如果单独的jsp页面不想生成Session可以在文件开头加入<%@ page session="false"%>。但是有些时候我们整个项目都不需要tomcat管理Session,如果每一个JSP、Servlet都手动添加<%@ page session="false"%>是不是有点太麻烦了?

 

2.如何不生成Session

    先来借鉴下Shiro是如何自己管理Session 的,Shiro框架在管理权限时,用户的Session是通过框架来管理的。

     

  需要认证的资源被访问时Shiro会判断Session。在集成了Shiro框架的web项目中,对getSession()方法debug下去发现,原来Shiro重写了getSession()来实现Session的管理。下面是Shiro覆盖的源码

publi  class ShiroHttpServletRequest extends HttpServletRequestWrapper {
……
public HttpSession getSession(boolean create) {

        HttpSession httpSession;

        if (isHttpSessions()) { //默认session
            httpSession = super.getSession(false); 
            if (httpSession == null && create) {
                //Shiro 1.2: assert that creation is enabled (SHIRO-266):
                if (WebUtils._isSessionCreationEnabled(this)) {
                    httpSession = super.getSession(create);
                } else {
                    throw newNoSessionCreationException();
                }
            }
        } else {//Shiro管理的Session
            if (this.session == null) {

                boolean existing = getSubject().getSession(false) != null;

                Session shiroSession = getSubject().getSession(create);
                if (shiroSession != null) {
                    this.session = new ShiroHttpSession(shiroSession, this, this.servletContext);
                    if (!existing) {
                        setAttribute(REFERENCED_SESSION_IS_NEW, Boolean.TRUE);
                    }
                }
            }
            httpSession = this.session;
        }

        return httpSession;
    }
    public HttpSession getSession() {
        return getSession(true);
    }
……
}

  从上面Shiro源码可以看到原来Shiro重写了默认的HttpServletRequestWrapper类。

 3.自己重写HttpServletRequestWrapper.getSession()

    我们也可以模仿Shiro的思路

    

//1.继承HttpServletRequestWrapper 重写getSession()方法
public class MyHttpServletRequest extends HttpServletRequestWrapper{
...
}

//2.配置一个过滤器,在过滤器中配置自己的Request类
 @Override
 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        chain.doFilter(new MyHttpServletRequest((HttpServletRequest) request), response);
 }

  

    上面的管理方法对于Session 的管理变的非常灵活,完全可以按照项目的需求继续拓展,比如Session的分布式管理,把Session数据缓存管理;移动端APP的Session管理等。

 

  • 大小: 153.9 KB
4
1
分享到:
评论
5 楼 herman_liu76 2016-07-04  
云上太阳 写道
herman_liu76 写道
请教:
完全不用时,为啥不在dofilter中直接写一句request.getSession(false);?


web项目不要Session的应该不多,本文说明的是不用Tomcat生成的Session,开发者自己管理Session。比如app服务器的token


谢谢,我们的小项目还没碰到过,查了一下。session比token明显太重量级了,开销比较大,所以有时候不要。

大概查了一下,tomcat没有直接关闭session的配置,其它人的方法有:所有请求都模拟一个人的session,或者自己实现sessionManager。
4 楼 herman_liu76 2016-07-04  
id.alex 写道
herman_liu76 写道
请教:
完全不用时,为啥不在dofilter中直接写一句request.getSession(false);?

因为无法保证在后面的 Servlet(或Controller等)不会使用 request.getSession(true),shiro 的方案覆盖了这个场景。


哦,明白了,这个设置不是一次请求中先设置好就一直有效的。
所以如果要严格控制一个对象,就要自己写代理类,或者包装类来拦截这个方法,而后面拿到的都不是原始对象了。
所以还要保证的是在这之前的filter不调用getSession就OK了。
3 楼 云上太阳 2016-07-04  
herman_liu76 写道
请教:
完全不用时,为啥不在dofilter中直接写一句request.getSession(false);?


web项目不要Session的应该不多,本文说明的是不用Tomcat生成的Session,开发者自己管理Session。比如app服务器的token
2 楼 id.alex 2016-07-04  
herman_liu76 写道
请教:
完全不用时,为啥不在dofilter中直接写一句request.getSession(false);?

因为无法保证在后面的 Servlet(或Controller等)不会使用 request.getSession(true),shiro 的方案覆盖了这个场景。
1 楼 herman_liu76 2016-07-04  
请教:
完全不用时,为啥不在dofilter中直接写一句request.getSession(false);?

相关推荐

    Tomcat中session的管理机制

    下面我们将深入探讨这个主题,包括请求过程中的session操作、SessionId的解析过程以及Session的管理机制。 1. 请求过程中的session操作: 当一个HTTP请求到达Tomcat服务器时,首先会解析请求头中的sessionId信息。...

    nginx_tomcat_redis搭建负载均衡共享session

    2. **安装和配置Tomcat**:在多台服务器上安装Tomcat,确保应用部署一致,禁用每个Tomcat实例的Session复制功能。 3. **安装和配置Redis**:安装Redis服务器,并确保所有Tomcat实例都能访问。Redis配置文件(一般为...

    servlet中关于session的理解

    ### 关于Servlet中的Session理解 在Web开发领域中,Servlet技术是Java Web开发的重要组成部分,而Session机制则是处理用户会话的关键技术之一。本文将基于提供的文件内容,深入探讨Servlet中Session的工作原理、...

    tomcat集群与会话共享

    - 必须禁用每个Tomcat实例的session管理,以免每个实例都创建自己的session。 - 使用相同的session ID生成策略以确保一致性。 - 考虑到性能和扩展性,应优化会话复制的频率和粒度。 总之,Tomcat集群和会话共享是...

    tomcat_performance_tuning_20071015

    【标题】"Tomcat Performance Tuning 20071015" 是一个由Steve Heckler编写的关于Tomcat服务器性能优化的PPT文档,它深入探讨了如何提升Apache Tomcat在处理Web应用程序时的效率和响应速度。Tomcat是Java Servlet和...

    Window下Apache负载均衡+Tomcat集群

    在本文中,我们将探讨如何在Windows环境下通过Apache HTTP Server实现负载均衡,并与多个Tomcat应用实例结合形成一个集群。这个配置适用于需要高可用性和可扩展性的Web应用程序部署,特别是当单个Tomcat实例无法满足...

    session-GitHub.rar

    本文将深入探讨“session-GitHub.rar”压缩包提供的解决方案,该方案旨在实现nginx、Tomcat(6、7、8、9版本)、redis以及session之间的会话共享。这种集成可以有效地提升系统的可扩展性和性能。 首先,让我们了解...

    Tomcat性能优化.rar

    《深入探讨:Tomcat性能优化》 在Java Web开发领域,Tomcat作为一款广泛应用的开源Servlet容器,其性能优化对于提升整个Web应用的响应速度和处理能力至关重要。本篇文章将全面解析Tomcat性能优化的各个方面,帮助...

    分布式服务集群下实现session共享解决方案.docx

    本文主要探讨了几种在分布式系统中实现session共享的解决方案。 首先,我们需要理解session的基本概念。session是在服务器端创建的一种存储用户会话状态的机制。每当新的客户端发起HTTP请求时,服务器会创建一个...

    tomcat架构解析_带索引书签目录_刘光瑞(著) .pdf.zip

    《Tomcat架构解析》是由刘光瑞编著的一本深入探讨Tomcat服务器核心架构的专业书籍。这本书详尽地阐述了Tomcat的内部工作机制,旨在帮助读者理解如何优化和管理这个广泛应用的Java Servlet容器。以下是对Tomcat架构的...

    Linux下通过Apache搭建Tomcat集群

    - 为了实现session复制或共享,可以在`context.xml`文件中配置`Manager`元素,或者在每个Tomcat实例间共享同一个session存储(如Redis或Memcached)。 5. **测试和监控** 配置完成后,重启Apache和所有Tomcat实例...

    Tomcat与Java.Web开发技术详解_tomcatjava_

    标题"Tomcat与Java.Web开发技术详解_tomcatjava_"表明了本文档将深入探讨Tomcat服务器以及使用Java进行Web应用程序开发的相关技术。Java.Web开发主要涉及使用Java语言来构建动态、交互式的Web应用程序,而Tomcat是...

    IE的cookie机制导致的session问题及解决办法.doc

    标题与描述概述的知识点主要集中在Internet Explorer(IE)的Cookie机制如何引发Session丢失的问题,并探讨了解决方案。本文将深入解析这一现象的原因、影响以及如何有效应对。 ### 一、IE Cookie机制与Session关联...

    tomcat6.0

    这篇博文将深入探讨Tomcat6.0的内部机制、配置方法以及常见问题的解决策略。 【标签】:“源码”意味着我们将分析Tomcat6.0的底层实现,理解其工作原理;“工具”则表明Tomcat是一个实用的开发和运行Java Web应用的...

    tomcat-5.5.9

    在本文中,我们将详细探讨Tomcat 5.5.9的核心特性、配置、部署以及性能优化策略。 一、Tomcat 5.5.9概述 Tomcat 5.5.x系列作为Tomcat的一个稳定版本,5.5.9是在5.5.x系列中的一个重要更新,它修复了许多已知问题,...

    https-nginx-tomcat配置.7z

    3. **Tomcat项目配置**:每个项目可能有自己的`server.xml`和`web.xml`,定义应用的部署路径、连接池、session配置等。 4. **负载均衡**:如果有多台Tomcat,Nginx可以配置为负载均衡器,根据策略(如轮询、权重等)...

    shiro文件 搭建攻防演练演示环境 解压后放入tomcat的webpass目录下即可

    下面我们将深入探讨Shiro反序列化漏洞及其影响,以及如何在Tomcat服务器上设置这样一个环境。 首先,让我们理解什么是反序列化漏洞。在Java中,序列化是将对象的状态转换为字节流的过程,以便存储或在网络上传输。...

    tomcat oracle java的系统部署.doc

    本文档主要探讨了如何解决在高并发情况下系统运行缓慢或崩溃的问题,并提供了一系列的参数设置和调优建议。 首先,针对Java代码的优化,需要注意类的初始化和方法调用。避免在初始化阶段过于复杂,尤其是对于静态...

Global site tag (gtag.js) - Google Analytics