【问题标题】:Get session id in tomcat access logs for angular js application在 Angular js 应用程序的 tomcat 访问日志中获取会话 ID
【发布时间】:2017-10-11 21:02:51
【问题描述】:

我们正在尝试使用'%S' in server.xml 在访问日志中打印会话ID。该应用程序是使用 Angular js 开发的。

但是它打印的是 "-" 而不是会话 ID。

server.xml

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="sessionId=%S host=%h %l %u %t &quot;%r&quot; %s %b" />

访问日志:

sessionId=- host=127.0.0.1 - - [12/May/2017:13:44:32 +0100] "GET /application/img/sort-icn-down.png HTTP/1.1" 200 1114

Angular js 应用程序会自动创建会话 id 吗?

【问题讨论】:

  • 除非您指定服务器如何处理会话,否则我们无法为您提供帮助。

标签: javascript angularjs session tomcat


【解决方案1】:

仅当您的服务器端应用程序创建一个会话 ID 时才会显示,这取决于您使用的框架...例如,如果请求中没有会话 ID,则 Spring MVC 总是创建一个新的会话 ID .

让我展示一个我用 Spring MVC 项目和 Tomcat 做的简单测试:

从我的 server.xml 中考虑以下 sn-p

<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs" prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u %t &quot;%r&quot; %s %b session-id %S" />

假设我在第一次访问打开图像时没有任何 cookie:

127.0.0.1 - - [26/Jun/2017:18:40:53 -0300] "GET /webapp/images/login.png HTTP/1.1" 200 29646 session-id -

由于是 Spring 未处理的图像,我的服务器不会创建会话 id...再次访问将无济于事

127.0.0.1 - - [26/Jun/2017:18:42:52 -0300] "GET /webapp/images/login.png HTTP/1.1" 304 - session-id -

但如果我访问由 Spring MVC 处理的方法,它将创建一个新会话(并且我无法完全控制会话的创建)

127.0.0.1 - - [26/Jun/2017:18:45:16 -0300] "GET /webapp/pages/users.json HTTP/1.1" 200 110 session-id 068FCCF5BC04EDEEC830E3E8CDF2CCDB

现在,从之前访问相同的图像,客户端将在请求中发送会话 ID,并且 Tomcat 将能够记录它

127.0.0.1 - - [26/Jun/2017:18:48:09 -0300] "GET /webapp/images/login.png HTTP/1.1" 200 29646 session-id 068FCCF5BC04EDEEC830E3E8CDF2CCDB

因此不会为图像、脚本或其他静态资源创建会话 ID。但这真的取决于您的实现或您正在使用的框架...... 您知道,JSESSIONID 位于 Servlet 3.0 specification 中(ch 7.1.1 cookie,第 55 页)。

【讨论】:

  • 我了解 Spring MVC。您是说 Angular JS 应用程序不会创建任何会话,因为它只会提供静态内容?
  • 在您的示例中,您正在访问一个图像 (/application/img/sort-icn-down.png),它似乎没有被 servlet 处理。通过我上面描述的测试,在这种情况下不会创建任何会话。但是,如果您的 AngularJS 客户端代码访问某个 servlet,则应该创建一个会话...
  • 当您询问“Angular JS 应用程序是否不会创建任何会话,因为它只提供静态内容”时,答案是肯定的 IF AngularJS 层只消耗静态内容内容。但我不认为会是这样,对吧?如果 AngularJS 层还从(例如)Spring MVC 控制器请求动态内容,则应创建会话并在响应中返回。
  • 所以你的意思是说,如果我托管一个 servlet 应用程序,它将负责创建会话,但是如果它依赖于托管在 tomcat 上的 angular JS 应用程序,它将与静态应用程序一样好获取数据的外部服务?
  • 如果我理解正确的话,访问您的应用程序的客户端(浏览器)只会从您的服务器请求静态内容(如脚本和图像)。将对另一个外部服务器发出其他请求。正确的?在这种情况下,您将不会获得任何会话。请记住,会话应该在请求之间保存数据......当您请求静态内容时不需要它。此外,Tomcat 用于在日志中显示会话 ID 的 JSESSIONID cookie 是由 Servlet 规范定义的,因此您需要对该规范进行一些实现,例如 Spring MVC。 =)
【解决方案2】:

不,Angular JS 不会为您生成 sessionId。您应该在服务器端生成和管理您的 sessionId。

【讨论】:

  • 我在服务器端没有任何代码。它只是前端的一个 Angular JS 应用程序。当浏览器访问页面时,我可以在 Tomcat 中看到访问日志。
  • 如何在服务器端创建和管理会话?你能举个例子吗?
  • 我不太了解 Tomcat,但一些快速的谷歌搜索应该可以为您提供所需的答案。它很可能也取决于您使用的 Tomcat 版本。看起来在 Tomcat 7 中 sessionIds 可能会自动创建。您应该发布完整的 tomcat 配置文件并将您的问题更改为“我如何在配置文件中的 tomcat 中生成会话?”
  • 如果 Tomcat 7 自动创建会话,这应该会自动创建 sessionId。
  • 我在谷歌上搜索了很多,然后才在 SO 上发布这个问题,然后在这个问题上悬赏 50 分。
猜你喜欢
  • 2011-10-04
  • 2014-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多