`
michael.softtech
  • 浏览: 208589 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

tomcat中cookie的设置与jsp中session的设置

阅读更多

          大家都知道,在开发一个互联网应用的时候,为了达到一种服务端和客户端有状态的效果,需要有一个sessionid     来对客户端进行标志。很多时候,这是通过在客户端防止session cookie实现的。但是如果客户端禁用了cookie呢?这就需要通过urlrewrite或者其他方式来实现。于是我们可能就在应用里面不需要cookie了。既然不需要了当然是希望我们的应用不对cookie进行处理。很遗憾的是,tomcat默认的是处理cookie的。每次请求过来的时候,都会解析request head里面的cookie信息,试图从中发现sessionid的信息。于是我们就需要从应用服务器层面把这个"无用功"去掉。

tomcat(我读的是tomcat6的源码)可以通过设置来实现:

在conf/context.xml里面:<Context cookies = "false">。那么就禁用了cookie了。

在源码级别的实现则是在CoyoteAdapter里面:

 protected void parseSessionCookiesId(org.apache.coyote.Request req, Request request) {

        // If session tracking via cookies has been disabled for the current
        // context, don't go looking for a session ID in a cookie as a cookie
        // from a parent context with a session ID may be present which would
        // overwrite the valid session ID encoded in the URL
        Context context = (Context) request.getMappingData().context;
        if (context != null && !context.getCookies())
            return; 

  在这里面做了一个判断,如果context禁用了cookie,那么就不做解析。如果使用cookie,那么试着从cookie里面解析

  sessionid,并且如果存在的话覆盖request里面已有的(从url里面解析出来的)或者还没有的sesssionid.

 这个方法的入口是在CoyoteAdapter的service方法里面,这个方法沿着tomcat6的component 链传递处理request 和response,结构图如下:

               service--------->EngineValue

                                            |

                                        HostValue

                                            |

                                        ContextValue

                                            |

                                         WrapperValue

这实际就是一个chain of resposibility模式,负责对request和response进行各自职责范围内的包装和处理。

最后的WrapperValue执行调用servlet处理请求的步骤。

 

好了,上面简单解释了cookie的处理,那么下面就是session了。

 

不管通过什么方式,通过cookie也好,通过urlrewrite也好,session在需要的时候是肯定要产生的.

但是如果我们不需要呢?比如恰好我们要展现给客户的首页就是jsp的,客户不需要登录就能浏览这个页面的内容。

那么这个时候对于客户的请求创建session就是没有必要的了。

 

一种常用的不创建session的方法是在jsp页面头上加一句:

<%@ page session=”false”>

这样在请求这个页面的时候就不产生session了。

这个在tomcat内部是怎么实现的呢?

 

首先明确一点,jsp在本质上是httpservlet,在/tomcat/work目录下面你会发现有跟自己的应用相同目录结构的一些文件,其中的jsp文件都变成了class文件,这实际是被jspcompiler编译过的。上面提到了WrapperValue会最终调用

servlet处理request。有兴趣的同学可以跟踪一下,会发现到了调用jsp对应的servlet(JspServlet)(这个是在tomcat/conf/web.xml里面配置的,对于.jsp,对应的servlet是jspservlet)时,最终会着落在

tomcat下面实现了PageContext接口的特定于jsp specification的实现类:PageContextImpl。

在这个类的initialize里面有这么一句:

if (request instanceof HttpServletRequest && needsSession)
			this.session = ((HttpServletRequest) request).getSession();

 这句的意思就是,有session获取session,没session新建一个。而通常,这个地方也是客户端与tomcat下面的应用交互时产生session的入口。

这句里面的needsSession就是之前提到的jsp页面上配置的值,默认是true.所以如果想在访问某个页面时不产生session,只需要设置成false就可以了。

1
0
分享到:
评论

相关推荐

    tomcat redis session.rar

    【标题】:“Tomcat Redis Session”指的是在Tomcat集群环境中,通过Redis来实现Session的共享与同步,以解决集群中的Session一致性问题。 【描述】:“Tomcat集群Nginx使用Redis保证Session同步”这一场景中,通常...

    tomcat+httpservlet+session+cookie+jsp+filter

    tomcat+httpservlet+session+cookie+jsp+filter

    Session Cookie的HttpOnly和secure属性

    如果在Cookie中设置了"HttpOnly"属性,那么通过程序(JS脚本、Applet等)将无法读取到Cookie信息,这样能有效的防止XSS攻击。 对于以上两个属性, 首先,secure属性是防止信息在传递的过程中被监听捕获后信息泄漏,...

    Tomcat8亲测可用 tomcat-redis-session-manager的jar包

    标题中的“Tomcat8亲测可用 tomcat-redis-session-manager的jar包”指的是一个专为Tomcat8设计的,用于管理session的扩展组件。这个组件实现了将Tomcat应用服务器中的用户session数据存储到Redis分布式缓存系统中,...

    tomcat8集群实现session共享,内含session共享包

    在IT行业中,尤其是在Web服务器领域,Tomcat是一个广泛使用的开源应用服务器,特别是对于Java Servlet和JavaServer Pages(JSP)的应用。在这个场景中,我们关注的是如何在Tomcat集群环境中实现Session共享,以便...

    Cookie&amp;Session&amp;JSP(十二).zip

    服务器在响应中设置Cookie,然后浏览器会在后续请求中携带这些Cookie回发给服务器。Cookie主要用途包括会话管理、个性化设置、跟踪用户行为等。每个Cookie通常包含键值对、过期时间、路径和域等信息。Cookie的最大...

    cookie设置httpOnly和secure属性实现及问题

    - **解决方案**: 将SessionID信息在启动Applet时传递进去,并在发送URLConnection请求时重新设置SessionCookie信息。 - **现象2**: 在HTTPS环境下,不允许jsp页面使用URLConnection访问servlet。 - **解决方案**:...

    Nginx+tomcat 实现负载均衡session共享demo

    1. **Cookie-Based**:将`session ID`存储在cookie中,每次请求时由客户端携带。这种方式简单但安全性较低,因为`session ID`可能被窃取。 2. ** Sticky Session**:`Nginx`配置中启用`sticky`,使用户请求始终定向...

    tomcat+redis共享session所需jar包

    Session是服务器端存储用户状态的一种方式,当用户在Web应用中登录后,服务器会为该用户创建一个唯一的Session ID,存储在客户端的Cookie中,每次请求时通过这个ID来识别用户状态。 在分布式环境中,不同的请求可能...

    servlet+cookie和Session

    总结来说,Servlet是Web应用的基石,它结合HttpServletRequest和HttpServletResponse处理请求和响应,通过Cookie和Session管理会话,与JSP协同工作呈现动态内容。而Filter、文件上传和下载等特性则扩展了Servlet的...

    tomcat8-session共享

    在IT行业中,尤其是在Web应用程序开发领域,Tomcat8是一个广泛使用的开源Servlet容器,它遵循Java Servlet和JavaServer Pages(JSP)规范。Session共享是Web应用中的关键问题,特别是对于那些需要跨多个服务器或者...

    JSP简易购物车 源码 session储存对象

    【JSP简易购物车 源码 session储存对象】是一个基于Java Server Pages(JSP)技术的简单购物车实现,它展示了如何利用session对象在Web应用程序中存储用户购物车的数据。这个项目对于初学者理解JSP和session的概念,...

    tomcat8 session 共享

    在IT行业中,Tomcat是一个广泛使用的Java应用服务器,特别是对于运行Servlet和JSP应用程序。Session共享是Web应用程序中一个关键的概念,它允许用户在不同页面间保持状态,这对于购物车、用户登录等应用场景至关重要...

    jsp+tomcat开发的小论坛

    在【标签】"jsp+tomcat开发的小论坛"中,我们可以推断出项目的重点在于JSP和Tomcat的整合应用。这包括但不限于如何配置Tomcat服务器以运行JSP页面,如何使用JSP动作元素(如&lt;jsp:include&gt;,&lt;jsp:forward&gt;等)和脚本...

    Tomcat 同一服务器上 不同web项目共享session的

    每个Web应用程序在默认情况下都有自己的独立session空间,这意味着在一个项目中设置的session属性不会自动传递到其他项目。 要实现Tomcat上的session共享,我们可以采取以下几种方法: 1. **共享Cookie**:这是最...

    jsp实验代码,使用session

    Session有一个默认的超时时间,通常在服务器配置中设置,例如在Tomcat的`web.xml`中: ```xml &lt;session-config&gt; &lt;session-timeout&gt;30&lt;/session-timeout&gt; &lt;/session-config&gt; ``` 这表示Session将在30分钟后...

    tomcat+nginx+session

    在Tomcat与Nginx结合的环境中,由于请求可能被Nginx分发到不同的Tomcat实例,所以需要一种机制来确保无论请求落在哪个实例上,都能访问到相同的session信息。 **知识点详解:** 1. **Tomcat**:Tomcat是一个开源的...

    nginx+tomcat6+redis实现session共享Jar文件

    在多台Tomcat服务器中,session数据的共享是通过将session信息存储在外部存储系统(如redis)来实现的,而不是传统的基于cookie或者内存中的管理方式。 然后,`redis`是一个开源的、基于键值对的数据存储系统,常被...

    apach tomcat 不同session负载均衡配置

    在这个场景下,"复制/粘住session"策略是关键,它确保用户在与服务器交互时,其session数据能够在不同的Tomcat实例间正确同步或保持在特定实例上。 一、session复制 Session复制是指将一个用户的session数据在集群...

Global site tag (gtag.js) - Google Analytics