【问题标题】:When using JSESSIONID in the URL, a new session is created在 URL 中使用 JSESSIONID 时,会创建一个新会话
【发布时间】:2018-07-22 08:25:35
【问题描述】:

我提出以下要求:

http://qwerty.localhost:82/Server/chat/connect;8O8488WlWWgNzAkGCFYAZyj3Bn91CR=05493D28DDD97308D66DAAC3DD66EAC2

左右:

http://qwerty.localhost:82/Server/chat/connect/;8O8488WlWWgNzAkGCFYAZyj3Bn91CR=05493D28DDD97308D66DAAC3DD66EAC2

在这种情况下,会话 id (8O8488WlWWgNzAkGCFYAZyj3Bn91CR) 在 cookie 和 url 中都被传递(因此出于安全考虑,突然间厨师将无法交付)。出于某种原因,正在创建一个新会话。为什么会这样?做错了什么?网址可以不...

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

    <session-config>
        <cookie-config>
            <name>8O8488WlWWgNzAkGCFYAZyj3Bn91CR</name>
            <http-only>true</http-only>
        </cookie-config>
        <tracking-mode>URL</tracking-mode>
        <tracking-mode>COOKIE</tracking-mode>
    </session-config>

</web-app>

【问题讨论】:

  • 我在 url 中没有看到 JSESSIONID
  • @user1516873 JSESSIONID = 8O8488WlWWgNzAkGCFYAZyj3Bn91CR(我设置在web.xml
  • 那你为什么不写有问题的呢?请添加配置和简短示例以及重现问题的步骤。
  • @user1516873 那是什么? In this case, the session id (8O8488WlWWgNzAkGCFYAZyj3Bn91CR) 。我更新标题。

标签: java session tomcat jakarta-ee


【解决方案1】:

好的,作为示例和概念证明,我创建了工作示例

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

    <session-config>
        <cookie-config>
            <name>8O8488WlWWgNzAkGCFYAZyj3Bn91CR</name>
            <http-only>true</http-only>
        </cookie-config>
        <tracking-mode>URL</tracking-mode>
        <tracking-mode>COOKIE</tracking-mode>
    </session-config>
    <servlet>
        <servlet-name>Test</servlet-name>
        <servlet-class>org.company.TestServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Test</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
</web-app>

小服务程序

package org.company;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

public class TestServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession(true);
        resp.getWriter().printf(session.getId()+ " isNew:" + session.isNew());
    }
}

构建脚本:

group 'org.company'
version '1.0-SNAPSHOT'

apply plugin: 'java'
apply plugin: 'war'

sourceCompatibility = 1.8

war{
    archiveName = 'ROOT.war'
}

repositories {
    mavenCentral()
}

dependencies {
    providedCompile group: 'javax.servlet', name: 'javax.servlet-api', version:'3.1.0'
}

在tomcat中部署war后:

请求没有cookie的页面

GET http://localhost:8080/
Host: localhost:8080
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
DNT: 1
Connection: keep-alive
Upgrade-Insecure-Requests: 1

回复:

Content-Length: 48
Date: Mon, 12 Feb 2018 12:32:08 GMT
Set-Cookie: 8O8488WlWWgNzAkGCFYAZyj3Bn91CR=AD5F8B47BB0CEC1A08D8887FB82384BD.tc00;path=/;HttpOnly

页面显示 AD5F8B47BB0CEC1A08D8887FB82384BD.tc00 isNew:true

如果您打开新浏览器(或进入隐身模式)并使用 cookie 请求页面:

GET http://localhost:8080/;8O8488WlWWgNzAkGCFYAZyj3Bn91CR=AD5F8B47BB0CEC1A08D8887FB82384BD.tc00

你会得到回报

AD5F8B47BB0CEC1A08D8887FB82384BD.tc00 isNew:false

标题

Content-Length: 49
Date: Mon, 12 Feb 2018 12:37:38 GMT

但是如果你改变那个值,例如

GET http://localhost:8080/;8O8488WlWWgNzAkGCFYAZyj3Bn91CR=AD5F8B47BB0CEC1A08D8887FB82384BD.tc01

你会得到新的会话 2061CBA151CE2148687B2BF48807253F.tc00 isNew:true 服务器将返回 set-cookie 标头

Content-Length: 48
Date: Mon, 12 Feb 2018 12:38:42 GMT
Set-Cookie: 8O8488WlWWgNzAkGCFYAZyj3Bn91CR=2061CBA151CE2148687B2BF48807253F.tc00;path=/;HttpOnly

一切都按预期工作,所以问题与程序的不同部分有关。

【讨论】:

    【解决方案2】:

    如果总是为每个请求创建一个新会话,则意味着客户端禁用了 cookie,并且 URL 重写无法正常工作。 如果您确实对 URL 进行了编码,容器将首先尝试使用 cookie 进行会话管理,并且仅在 cookie 方法失败时才回退到 URL 重写。

    试试这个方法:
    HttpSession session = request.getSession(false);//传递“false”表示该方法返回一个预先存在的会话,如果没有与此客户端关联的会话,则返回null。

    对于 URL 重写,使用 response.encodeURL()

    【讨论】:

    • 这个用在哪里?
    • 在 servlet 中,您将在其中发送请求并编写用于创建会话的代码。
    • tomcat8 创建会话。不是我。我不会为创建会话编写代码。
    • 你能写出例子吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-25
    • 1970-01-01
    • 2018-12-25
    • 1970-01-01
    • 2016-06-01
    • 2014-04-25
    相关资源
    最近更新 更多