精华内容
下载资源
问答
  • Tomcat如何禁用session

    2020-08-07 14:17:24
    有时候我们不需要用到session,而session在tomcat中是属于关键功能,它在启动的时候会自动创建,这样就会消耗一定的内存空间,如果访问量大了session就会产生很多。这样也不利于我们进行分布扩展。 JSESSIONID的...

    有时候我们不需要用到session,而session在tomcat中是属于关键功能,它在启动的时候会自动创建,这样就会消耗一定的内存空间,如果访问量大了session就会产生很多。这样也不利于我们进行分布扩展。
     

    JSESSIONID的产生机制

    tomcat只有在程序中使用了 xxx.getSession() 的时候才会创建session(JSESSIONID是它的标识),其他任何时候都不会主动去创建。

    这个时候有人问了,我的程序里明确没有调用 xxx.getSession(),为什么还会创建session?原因是用到了jsp作为渲染机制,你去看一下在tomcat的工作目录中所对应的jsp编译好的.class或者也有.java文件,能够看到:session = pageContext.getSession();这样一段代码。这个session也就是jsp几个内置对象中含有session对象的来源。所以,只要你用到了 jsp,那么就会默认产生session。 

    那不用jsp,而用 servlet 的话,会不会主动创建 session 呢?不会的,因为对于Controller或者Action来说,本质上还是servlet。不会的,除非你自己写 xxx.getSession()。

    那我也不用jsp,用其他的模板引擎,比如 freemarker 或者 Thymeleaf,会不会主动创建 session 呢?不会的,除非这个模板引擎中也主动调用xxx.getSession,否则不会。

    那我既不用jsp,也不用servlet,用的是 spring的Controller或者 struts 的Action,那会不会主动创建 session 呢?不会的,因为对于Controller或者Action来说,本质上还是servlet。

    解决办法

    通过上面的机制分析,很明显禁用tomcat的session的最好途径就是告诉jsp,不要主动创建session,那么方式是在每个jsp页面中加入:

    <%@ page session="false" %>

    这种方式需要在每一个jsp页面加入以上代码,或者引用共同的jsp。如果某一个页面忘记引用或者是JAVA部分代码主动的去获取了xxx.getSession(),那么还是会产生session。

    所以本人倾向于第二种方式,在tomcat中停止创建session,自定义一个SessionManager

    package com.noSession;
    
    import java.io.IOException;
    import org.apache.catalina.Lifecycle;
    import org.apache.catalina.LifecycleException;
    import org.apache.catalina.LifecycleState;
    import org.apache.catalina.Session;
    import org.apache.catalina.session.ManagerBase;
    
    public class SessionManager extends ManagerBase implements Lifecycle {
    
    	@Override
    	protected synchronized void startInternal() throws LifecycleException {
    
    		super.startInternal();
    		setState(LifecycleState.STARTING);
    	}
    
    	@Override
    	protected synchronized void stopInternal() throws LifecycleException {
    
    		setState(LifecycleState.STOPPING);
    	}
    
    	@Override
    	public void load() throws ClassNotFoundException, IOException {
    	}
    
    	@Override
    	public void unload() throws IOException {
    	}
    
    	@Override
    	public Session createSession(String sessionId) {
    
    		return null;
    	}
    
    	@Override
    	public Session createEmptySession() {
    
    		return null;
    	}
    
    }

    注意,上面这个SessionManager中createSession、createEmptySession方法返回的是null。

    在使用jsp的时候会报错Page needs a session and none is available。

    有一下两种解决方案:

    1.在jsp中加上

    <%@ page session="false" %>

    2.全局使用同一个session

    import java.io.IOException;
    
    import org.apache.catalina.Lifecycle;
    import org.apache.catalina.LifecycleException;
    import org.apache.catalina.LifecycleState;
    import org.apache.catalina.Session;
    import org.apache.catalina.session.ManagerBase;
    
    public class SessionManager extends ManagerBase implements Lifecycle {
    
        private Session globalSession;
    
        @Override
        protected synchronized void startInternal() throws LifecycleException {
            super.startInternal();
            setState(LifecycleState.STARTING);
        }
    
        @Override
        protected synchronized void stopInternal() throws LifecycleException {
            setState(LifecycleState.STOPPING);
        }
    
        @Override
        public void load() throws ClassNotFoundException, IOException {
        }
    
        @Override
        public void unload() throws IOException {
        }
    
        @Override
        public Session createSession(String sessionId) {
            if(globalSession == null) {
                globalSession = super.createSession(sessionId);
            } else {
                globalSession.setValid(true);
            }
    
            return globalSession;
        }
    
        @Override
        public Session createEmptySession() {
            if(globalSession == null) {
                globalSession = super.createSession(sessionId);
            } else {
                globalSession.setValid(true);
            }
    
            return globalSession;
        }
    
    }
    

    还需要注意这个globalSession需要进行激活,否则在tomcat的session失效后,会将此session标注为失效,那么尽管globalSession还是存在的,但是是失效的状态,还是会报错说session不存在。所以globalSession.setValid(true);这句很重要。

    然后,在tomcat的server.xml中进行设置,或者配置host的其他方式

    <Context docBase="D:\test" path="/test" reloadable="false" sessionCookieName="yoursessionname">
        <Manager className="xxx.xxx.SessionManager" />
    </Context>
    

    上面的sessionCookieName默认是JSESSIONID,其实这个是有点点缺陷的,能够让别人知道你的应用是用java开发的,所以,换个其他的名字会更好一些。

    最后,将SessionManager打包为jar包,放到tomcat的lib文件夹下面

     

     

     

    展开全文
  • tomcat urlrewrite时,url地址栏中出现了jsessionid,这对于seo是不友好的,于是上网找了一些资料。 http://tuckey.org/urlrewrite/manual/3.0/urlrewrite-conf-overview-sample.html [quote] Outbound ...
    在tomcat urlrewrite时,url地址栏中出现了jsessionid,这对于seo是不友好的,于是上网找了一些资料。
    

    http://tuckey.org/urlrewrite/manual/3.0/urlrewrite-conf-overview-sample.html


    [quote]
    Outbound Rule 1
    Outbound URL's matching ^(.*);jsessionid=.*$ will be rewritten to $1.

    Given that the following condtion is met.

    1. The user-agent HTTP header matches the value googlebot.*

    Outbound Rule 2

    Outbound URL's matching *;jsessionid=* will be rewritten to $1, after response.encodeURL() has been called.

    Given that the following condtion is met.

    1. The user-agent HTTP header matches the value googlebot*
    [/quote]

    http://tuckey.org/urlrewrite/manual/3.0/guide.html
    [quote]
    Hide jsessionid for requests from googlebot.


    <outbound-rule>
    <name>Strip URL Session ID's</name>
    <note>
    Strip ;jsession=XXX from urls passed through
    response.encodeURL().
    The characters ? and # are the only things we can use to
    find out where the jsessionid ends.
    The expression in 'from' below contains three capture
    groups, the last two being optional.
    1, everything before ;jesessionid
    2, everything after ;jesessionid=XXX starting with a ?
    (to get the query string) up to #
    3, everything ;jesessionid=XXX and optionally ?XXX
    starting with a # (to get the target)
    eg,
    from index.jsp;jsessionid=sss?qqq to index.jsp?qqq
    from index.jsp;jsessionid=sss?qqq#ttt to index.jsp?qqq#ttt
    from index.jsp;jsessionid=asdasdasdsadsadasd#dfds -
    index.jsp#dfds
    from u.jsp;jsessionid=wert.hg - u.jsp
    from /;jsessionid=tyu - /
    </note>
    <condition name="user-agent">googlebot</condition>
    <from>^(.*?)(?:\;jsessionid=[^\?#]*)?(\?[^#]*)?(#.*)?$</from>
    <to>$1$2$3</to>
    </outbound-rule<
    [/quote]

    于是在urlrewrite.xml加入以下代码:
    [quote]<outbound-rule encodefirst="true">
    <from>^(.*);jsessionid=.*$</from>
    <to>$1</to>
    </outbound-rule>[/quote]
    但是时灵时不灵,先记下,有时间再解决。
    展开全文
  • tomcat8相关配置问题

    2016-07-21 14:18:48
    1、tomcat对SSL支持,找到config/server.xml,找到SSL节点去掉注释。用keytool工具生成证书命令如下: keytool -genkeypair -alias "tomcat" -keyalg "RSA" -keystore "/home/tomcat.keystore" 在注释节点后面追加 ...

    1、tomcat对SSL支持,找到config/server.xml,找到SSL节点去掉注释。用keytool工具生成证书命令如下:

    keytool -genkeypair -alias "tomcat" -keyalg "RSA" -keystore "/home/tomcat.keystore"

    在注释节点后面追加 keystoreFile="/home/key.store" keyPass="tomcat" 属性 还有个参数ciphers参考 http://wiki.apache.org/tomcat/HowTo/SSLCiphers

    2、httservlet对象,实现了servlet容器的接口,被容器管理,servlet-mapping 指明特定的httpservlet对象管理那些资源范围。

    比如:

    <servlet>

    <servlet-name>HelloWorldServlet</servlet-name>

    <servlet-class>HelloWorldServletClass<servlet-class>

    </servlet>

    <serlvlet-mapping>

    <servlet-name>HelloWorldServlet</servlet-name>

    <url-pattern>/hello/test<url-pattern>

    </servlet-mapping>
    表示helloworldservlet管理/hello/test资源

    资源也可以是范围,用通配符表示

    3、tomcat安装好后,安全设置:

    删除tomcat下面的examples,docs文件夹

    使用普通账号启动tomcat,比如创建一个用户

    groupadd -g 80 tomcatlog 

    add user -o home /tomcatlog --shell /sbin/nologin/ --uid 80 --gid 80 -c "web app" tomcatlog

    chown tomcatlog:tomcatlog -R /home/tomcat/*

    su -tomcatlog -c "/tomcat/bin/startup.sh"

    可以用80端口映射8080端口

    关闭war包自动部署 unparkwars="false" autodeploy="false"

    tomcat部署和启动分开权限

    add user --home /www -c "web app" www

    修改tomcat session变量名称jsession,比如phpsessid

    展开全文
  • Jsessionid只是tomcat的对sessionid的叫法,其实就是sessionid;在其它的容器也许就不叫jsessionid了 2.那么有什么问题? 首先这是一个保险措施 因为Session默认是需要Cookie支持的,但有些客户浏览器是关闭Cookie的...

    转载自https://my.oschina.net/wangnian/blog/648022

    1.jsessionid是什么?

    Jsessionid只是tomcat的对sessionid的叫法,其实就是sessionid;在其它的容器也许就不叫jsessionid了

    2.那么有什么问题?

    首先这是一个保险措施 因为Session默认是需要Cookie支持的,但有些客户浏览器是关闭Cookie的,所以在这个时候就需要在URL中指定服务器上的session标识,也就是EDE802AB96CD1E0CA2AFB3830D18FB10,每当用户第一次访问页面的时候,后端获取的地址是包含 jsessionid参数,这样拼接 静态资源或者A标签或Form的地址的时候,链接就变成了:

    http://localhost:8080?jsessionid=EDE802AB96CD1E0CA2AFB3830D18FB10home/user 造成访问相关页面404.

    3.解决方法

    (1)web.xml配置
    <session-config>
        <tracking-mode>COOKIE</tracking-mode>
        <tracking-mode>URL</tracking-mode>
        <tracking-mode>SSL</tracking-mode>
    </session-config>
    

    以上是Servlet3.0最会话跟踪的三个方式,Servlet 3.0规范实施前tomcat的会话跟踪用两种方法:COOKIE和带JSESSIONID参数的重写URL。 在 Tomcat 7中的URL重写方法不再是强制性的,并加入一个新的会话跟踪方法基于SSL会话。
    移除tracking-modeURL/tracking-mode 就解决了jsessionid的问题。

    (2)spring boot三种方式
    1)启动类 继承 SpringBootServletInitializer 重写onStartup方法
    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
    super.onStartup(servletContext);
    servletContext.setSessionTrackingModes(Collections.singleton(SessionTrackingMode.COOKIE));
    SessionCookieConfig sessionCookieConfig=servletContext.getSessionCookieConfig();
    sessionCookieConfig.setHttpOnly(true);
    }
    
    2)在@Configuration配置类上注册bean
    @Bean
    public ServletContextInitializer servletContextInitializer1() {
        return new ServletContextInitializer() {
            @Override
            public void onStartup(ServletContext servletContext) throws ServletException {
                servletContext.setSessionTrackingModes(Collections.singleton(SessionTrackingMode.COOKIE) );
            }
        };
    }
    
    3)在springboot properties配置
    server.session.tracking-modes=
    
    展开全文
  • Apache Shiro去掉URL中的JSESSIONID

    万次阅读 2016-04-01 19:09:14
    举个例子,如果你想集群会话,但你使用 Jetty 在生产、测试和 Tomcat 容器配置(或代码)将不具有可移植性。所以我们用 DefaultWebSessionManager  Shiro 的原生会话管理。所以网上的那些基于 servlet 的 不起作用。...
  •  我在spring boot 2.0.0 RELEASE版本中使用内嵌Tomcat启动时,在application.yml中增加如下: server: session: tracking-modes: cookie  发现不生效,org.springframework.boot.autoconfigure.web....
  • 基于此推论,我模拟了另一种实验情况,去掉重定向的功能: 情况2: 在本地开两个web服务,端口分别是8080,8081。 localhost:8081/test @GetMapping("/test") public void get1(HttpServletRequest request, ...
  • Servlet的详细教程

    2021-09-09 18:02:45
    文章目录一、Servlet的简介二、Servlet的入门案例三、创建Servlet的三种方式3.1实现Servlet接口的方式3.2继承GenericServlet抽象类的方式3.3继承...servlet是需要运行在Java服务器(Tomcat)中的,符合http协议的s
  • destroy方法: tomcat服务器停止或web应用重新部署,servlet对象销毁,destroy方法被调用。 2)ServletConfig对象 获取servlet的初始化参数: getInitParameter("name "); getInitParameterNames(); ...
  • 微服务session落坑记

    2018-06-17 08:42:30
    本文适用于对session、cookie有一定了解的同学,主要以问题定位过程为线索,简单讲述tomcat session生成机制、oauth2认证过程以及spring方法参数映射处理等内容 背景知识: session:由于http协议无状态,为了保存...
  • JS如何获取JSESSIONID?

    千次阅读 2020-03-08 14:24:12
    问题描述:利用js试图获取cookies里面的...但是因为特殊的需求,需要从JS中获取JSESSIONID,所以需要将这个属性去掉。 解决办法: 在Tomcat配置文件 context.xml里面添加这么一句: 然后就可以了: ...
  • 相信每个 Java 程序员都熟悉如下一种情形:访问一个需要登录的应用系统,当输入登录名和密码登录后,一般系统会保存相应的用户及权限信息到 session 中,同时会生成一个 session 的 唯一id值,称作:jsession
  • Cas单点登录

    2018-05-11 15:02:18
    1. 系统A去Cookie中取JSESSION,Cookie中没有JSESSION(TGC),说明系统A未登录。2. 系统A重定向到CAS服务端,CAS服务端检查是否已生成TGT(浏览器和客户端之间的全局会话),没有TGT,说明当前打开的浏览器没有进行过...
  • Servlet知识梳理

    2014-10-21 07:52:30
    Tomcat配置 ② 在不配置JAVAHOME的前提下启动tomcat 在startup.bat的第25行中添加set JAVA_HOME=JDK路劲
  • 常见面试题总结

    2021-04-19 13:11:03
    01 怎么样封装简历 写技能,至少有一两项是精通的,不要全是熟悉这样泛泛而谈 想投一个公司,根据想投公司的岗位要求,把自己的简历对着改 02 hashmap底层执行原理 hashmap的存储结构 数组、链表、红黑树 ...
  • 基于此推论,我模拟了另一种实验情况,去掉重定向的功能: 情况2: 在本地开两个web服务,端口分别是8080,8081。 localhost:8081/test @GetMapping("/test") public void get1(HttpServletRequest request, ...
  • session深入探讨

    2018-12-11 17:12:00
    基于此推论,我模拟了另一种实验情况,去掉重定向的功能 : 情况2: 在本地开两个web服务,端口分别是8080,8081。 localhost:8081/test @GetMapping("/test") public void get1(HttpServletRequest ...
  • 去掉后面的.do和前面的“/”,得到方法名即xxx。利用反射调用相关方法。   java中文乱码问题:在jsp页面上输入中文,提交页面后不出现乱码pageEncoding, charset的编码一致,且都支持中文,建议为utf-8,还需...
  • 对 Session 的深入探讨

    2020-06-07 11:45:00
    基于此推论,我模拟了另一种实验情况,去掉重定向的功能: 情况2: 在本地开两个web服务,端口分别是8080,8081。 localhost:8081/test @GetMapping("/test") public void get1(HttpServletRequest request, ...
  • Servlet

    2021-02-16 11:51:42
    实际上 Tomcat部分是Apache服务器的扩展,但它是独立运行的,所以当你运行tomcat时,它实际上作为一个与Apache 独立的进程单独运行的。 ​ 当配置正确时,Apache为HTML页面服务,而Tomcat实际上是在运行J3P页面和...
  • 还有自带JSESSION的cookie 创建cookie对象:new Cookie(key,value) 获取key:getName() 获取值:getValue() 设置最大有效期:setMaxAge(int time) JavaBean 与数据库操作时,通常会把需要操作的数据封装成一个...
  • -- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] 2021-01-13 15:45:38.022 INFO 47736 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache ...
  • javaee杂谈

    2018-04-12 13:43:25
    欢迎大家进行JavaEE培训第一天 java技术加强Eclipse的使用工作空间(workspace)、工程(project)、工作组(working set)在eclipse下Java程序的编写和运行,及java运行环境的配置。快捷键的配置,常用快捷键:• 内容...
  • Servlet学习

    2021-09-17 10:31:48
    Tomcat目录 1.Tomcat目录学习 2.HTTP-浏览器和服务器的交互流程 3.浏览器中的书写格式 4.下载测试" data-link-title="下载测试"><a href="#1">下载测试</a> 5. 6. 7. 8. 9. 10. 11. 12. ...
  • • JSESSION 未开启 httpOnly • tomcat以root启动 • 默认的 webapps 没有删除 • 当发生攻击,插件会额外输出 `confidence` 字段,用于标识检测结果可靠性 • 所有响应增加 `X-Protected-By: OpenRASP` 响应头 ...

空空如也

空空如也

1 2 3 4
收藏数 74
精华内容 29
关键字:

tomcat去掉jsession