gpt4 book ai didi

java - 我的 WebApp 如何通过 Tomcat Valve 检索数据集?

转载 作者:行者123 更新时间:2023-11-28 22:09:18 25 4
gpt4 key购买 nike

我正在尝试检索由 JSF2 支持 bean(或 servlet)中的自定义 Tomcat Valve 设置的值。我不知道如何执行此操作,也找不到任何使用 Google 的示例。

背景:在我的 JSF2 网络应用程序中,我需要为每个用户添加一个时区属性。实现这一点的最简单方法是在用户配置文件页面添加时区下拉列表,以便每个用户都可以选择合适的时区。然而,这可以自动化,因为 bit of JavaScript in the browser能够自动计算时区。

所以我在我的 Tomcat 登录页面上放置了一个新参数,它提供了这个值,Web 应用程序可以在登录时捕获该值。 Tomcat 表单例份验证机制负责处理登录页面(通过 HTTP POST 到 j_security_check)。我实现了一个 Java EE Servlet 过滤器来捕捉这个,但是 Tomcat 的登录机制绕过了过滤器,所以这段代码永远不会看到 POST 到 j_security_check。

我现在已经实现了一个 Tomcat Valve,我可以成功地捕捉到 j_security_check 的 POST。在代码中,我提取了时区值并将其放在...位置?

我知道阀门(必须放在 TOMCAT_HOME/lib 中)与我的常规 JSF2 代码有不同的类加载器。这意味着我无法从我的 JSF2 代码访问阀的任何静态成员。

受到标准 Tomcat 阀门源代码的启发,我在阀门中尝试了这个:

final org.apache.catalina.Session session = request.getSessionInternal(true);
session.setNote("com.conexa.timezoneOffset", timezoneOffset);

但是,在我的 JSF2 托管 bean 中,我无法获得对 org.apache.catalina.Session 的引用。

此代码返回一个 StandardSessionFacade 类型的对象,它不允许我访问 org.apache.catalina.Session。

FacesContext.getCurrentInstance().getExternalContext().getSession(false);

在 Debug模式下运行,我已经能够找到 org.apache.catalina.Session,但“注释”字段实际上是空的。

我还认为 Tomcat 可能使用一个 session 进行登录,然后再创建一个新 session (可能与 Session Fixation Protection 有关)。如果确实如此,我认为问题会更加复杂。

有没有 Tomcat 大师有什么好主意?普通 servlet 的解决方案也是可以接受的,因为我确信我能够适应它。

最佳答案

好的,知道了!

在阀门代码中:

final HttpSession session = request.getSession(true);
session.setAttribute("timezoneOffset", timezoneOffset);

在 JSF2 代码中:

final ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
final String timezoneOffsetStr = "" + externalContext.getSessionMap().get("timezoneOffset");

关于java - 我的 WebApp 如何通过 Tomcat Valve 检索数据集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11828440/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com