- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在这里提出这个问题已经走了很长一段路,并且略有超出选择范围,因此我想我应该转而引用此站点,该站点似乎总是可以解决我的大多数问题。抱歉,很长的帖子,但某些情况很重要。
我们有一个Java Web应用程序(.war),它可以托管在多个应用程序服务器上(用于内部开发的Tomcat,一些客户的Weblogic 10.3.5,其他客户的Websphere和其他客户的Glassfish)。对于它的价值,它在jdk 1.6上
我们使用旧版本的Struts(1.0.2)进行动作映射,在我们的web.xml文件中定义了几个过滤器,我们还为某些应用程序服务器提供了其他配置文件(例如,用于weblogic的weblogic.xml文件)元素很少)。视图层都是带有一些js的jsp。
我们有一个主要的入口点/类来处理http请求,该请求扩展了Struts ActionServlet类。
这是在weblogic(WLS)服务器10.3.5上部署和测试应用程序时的问题,在其他任何应用程序服务器上都从未遇到我要描述的问题。
用户将通过调用初始的struts动作(例如“ / login”)来尝试一个简单的初始记录动作。
<action path="/login"
type="com.<...>.LoginAction"
name="loginForm"
scope="session"
validate="false">
<forward name="success" path="/completeLogin" internal="true"/>
[...]
</action>
<action path="/completeLogin"
type="com.<...>.CompleteLoginAction"
name="loginForm"
scope="session">
<forward name="success" path="home.jsp"/>
[...]
</action>
public class LoginAction extends GenericAction {
private static final Logger log = LoggerFactory.getLogger(LoginAction.class);
private static final String JSESSIONID_COOKIE_NAME = "JSESSIONID";
@Override
public ActionForward internalPerform(ActionMapping mapping, BaseForm form,
HttpServletRequest request, HttpServletResponse response) throws InvalidSessionException {
String clientOwner = null;
String registeredHost = null;
/*
* Temporary patch for Weblogic JAS. Will be removed eventually.
*/
verifyJSessionIdCookies(request, response);
try {
[...]
}
protected void verifyJSessionIdCookies(HttpServletRequest request, HttpServletResponse response) {
Cookie[] existingCookies = request.getCookies();
HttpSession session = request.getSession(false);
if (null != existingCookies && null != session) {
for (Cookie cookie : existingCookies) {
if (cookie.getName().equals(JSESSIONID_COOKIE_NAME) && !cookie.getValue().equals(session.getId())) {
log.debug("Updating current client JSESSIONID cookie from {} to value {}", cookie.getValue(),
session.getId());
cookie.setValue(session.getId());
}
}
}
}
}
<?xml version="1.0" encoding="UTF-8"?>
<weblogic-web-app>
<container-descriptor>
<prefer-web-inf-classes>false</prefer-web-inf-classes>
<prefer-application-packages>
<package-name>org.apache.commons.lang.*</package-name>
</prefer-application-packages>
</container-descriptor>
<BEA-000000> <HttpRequest@17756711 - /ourwebapp/login.do: SessionID not found for WASC=ServletContext@2256126[app:ourwebapp module:ourwebapp path:/chapel spec-version:2.5]>
<BEA-000000> <HttpRequest@17756711 - /ourwebapp/login.do: Creating new session>
<BEA-000000> <HttpRequest@11453786 - /ourwebapp/getHomePage.do: [RemoteSessionFetching] obtained workManager: null>
<BEA-000000> <HttpRequest@11453786 - /ourwebapp/getHomePage.do: Servername: localhost>
<BEA-000000> <HttpRequest@11453786 - /ourwebapp/getHomePage.do: Serverport: 7001>
[..]
<BEA-000000> <HttpRequest@11453786 - /ourwebapp/getHomePage.do: SessionID not found for WASC=ServletContext@2256126[app:ourwebapp module:ourwebapp path:/ourwebapp spec-version:2.5]>
<BEA-000000> <HttpRequest@11453786 - /ourwebapp/getHomePage.do: Creating new session>
RequestDispatcher rd = getServletContext().getRequestDispatcher(path);
if (null == rd) {
String errorMessage = internal.getMessage(REQUEST_DISPATCHER, path);
log.debug(errorMessage);
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, errorMessage);
return;
}
if (null != request.getAttribute(Constants.INCLUDED_REQUEST)) {
rd.include(request, response);
} else {
try {
//fails after this call
rd.forward(request, response); [..]
public ActionForward perform(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws IOException, ServletException {
//displays a new id
log.debug("Http session after forward : {}", request.getSession(false).getId());
String mappingPath = mapping.getPath();
boolean outOfSessionAction = outOfSessionPaths.contains(mappingPath);
Attribute attr = null;
if (!outOfSessionAction) {
attr = request.getSession().getAttribute("attr1");
if (attr == null) {
//we should be retrieving this attribute but we fail because
//new HttpSession in the request object
return processException(request, mapping, new BusinessException(true));
}
}
最佳答案
我本人已经解决了这个问题,这不是一件容易的事,但是事实证明,涉及到几个因素。首先,代码中仍然有一个地方会不必要地使会话无效,我删除了那个地方。
但是其次,也是最有趣的是,我们的应用程序是由客户从另一个WLS实例上但使用相同域名的另一个应用程序访问的。即:www.abc.com/customer_app重定向到www.abc.com/our_web_app,据我了解,这样做会使浏览器也将来自/ customer_app的所有cookie都包含在重定向请求中。其中还有一个JSESSIONID cookie(在/ our_web_app的上下文中不存在)。那个问题就在那里。
WLS第一次看到未知的JSESSIONID cookie时反应良好,它只是忽略了它(因为它无法将其映射到内存中的任何http会话),并为our_web_app创建了一个新的cookie。问题是两个cookie都设置在cookie路径“ /”上,这意味着在我们的应用程序中发生转发时,WLS有时会读取旧的无意义的JSESSIONID cookie,有时还会为our_web_app创建正确的新cookie。当它读取旧的cookie时,它将再次无法识别它并创建一个新的http会话(产生一个新的JSESSIONID cookie),从而丢失了先前创建的http会话中的任何信息(登录后)。
一个不错的临时解决方法是在通过我们的应用程序创建的cookie上设置一个更具体的cookie路径,这样,它们似乎首先出现在cookie列表中,并且始终被优先考虑在其他JSESSIONID cookie之前。
即在cookie路径“ /”上时,cookie列表可能显示为:
SOME_CUSTOMER_COOKIE1:value1,SOME_CUSTOMER_COOKIE2:value2,JSESSIONID:oldID,JSESSIONID:newCorrectID
为在我们的网络应用中创建的cookie设置cookie路径“ / our_web_app”后:
JSESSIONID:newCorrectID,SOME_CUSTOMER_COOKIE1:value1,SOME_CUSTOMER_COOKIE2:value2,JSESSIONID:oldID
理想情况下,可以通过确保不为两个应用程序使用相同的域名nane或什至更改our_web_app的cookie-name属性(例如,JSESSIOND-> WEB_APP_SESSION_ID)来避免这种情况,但是出于技术原因(主要在客户端) ,与负载平衡和成本问题有关)都不是我们的选择。
希望这对某人有帮助。
关于java - Weblogic session 转发中未维护Java Servlet HttpSession,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31998148/
我们已经在我的工作场所使用 SVN 几年了,自从我们安装它以来,除了更新和备份之外,我们真的没有对其进行任何类型的维护。我们还应该做些什么来维护 SVN,或者我们已经做了所有我们真正需要做的事情吗?
正则表达式模式如下: ".*/.*/.*/.*/.*/.*/(.*)-\d{2}\.\d{2}\.\d{2}.\d{4}.*" 确实很难维护。 我想知道,有没有这样的东西: ".*/.*/.*/.*/
我已经搜索了一些,但没有找到任何对我有帮助的问题/答案。问题是我的 jQuery 函数调用变得太大而无法维护。我想知道我是否应该进行更多重构,或者是否有更好的方法来完成所有这些调用。当我进行一次调用时
我在 mySql 中有一个记录表。我需要按照用户指定的方式为它们维护订单。所以我添加了一个“位置”列。 当我移动特定记录时更新所有记录的 SQL 语句是什么?我有类似的东西: UPDATE items
我正在使用 go channels 作为类似队列的机制,这非常适合我。我正在为每个用户打开这些类似队列的 channel 之一,并为这些 channel 中的每一个都有一个 for-range 循环。
使用 docker,您可以非常好地基于其他图像创建图像。例如,您可以制作一个镜像 Java-jdk7(基于最新的 Ubuntu LTS),并在此基础上创建镜像 elastic-search 和 tom
我正在用 Bash 编写脚本。 我的关联数组有问题,当我像这样在我的数组中放置一条记录时: declare -A arr_list_people_name 我将文本放入循环关联数组的方式(将文本排序)
我目前正在开发一个系统,该系统需要在没有可用互联网连接的情况下安装 python(或者至少我不能假设有可用的互联网连接), 我想知道维护 PIP 存储库的间接费用是多少,而且这样的存储库也可能会满足系
我正在考虑使用 Chrome 扩展的国际化支持,如 here 所述. 建议的翻译方法是先创建英文 messages.json 文件,然后将其复制并翻译成给定的语言。 我的问题是,这对于初始翻译来说工作
我想在(自托管)bitbucket 服务器中克隆 github 存储库,并不时从 github 存储库中提取最新更改。在我们的克隆中,我们将做一些永远不会离开我们的存储库的实验性内容。 为了显示;对于
我的应用程序基于银行域,需要 session 处理。当应用程序空闲时(应用程序打开后没有任何触摸事件)必须在后台计算时间。 当应用程序进入前台时,我处理 session 维护以及 AppDelegat
我可以保持 UISegmentViewControl 段的选定状态吗?即,即使用户选择了另一个段,也可以保持一个段显示为选中状态?我似乎在任何地方都找不到任何可以做到这一点的东西!! 最佳答案 这是不
我的要求:我想将登录详细信息(电子邮件、密码)发送到服务器,必须保持有效用户名的 session 。 如何使用 iphone SDK 的“NSURLConnection”创建和维护 session ?
就像Carl's question over here我想问你(因为我自己找不到 :( ) 删除既不是静态也不是动态(例如通过反射)使用的程序集引用是否有任何好处。 最佳答案 除了清理项目之外,删除未
我使用的是Bootstrap 3。我目前有2个页面,一个是查看页面,一个是编辑页面。两个页面都有许多导航选项卡,例如 id= tab1、tab2、tab3。 我想要实现的是,当我在查看页面的 tab2
我正在创建 Chrome 应用程序,我希望我的用户在首次进入应用程序时登录或创建用户。 目标: 在 Chrome 打包的应用程序上维护登录状态。 问题: Cookie - Chrome 打包的应用程序
我有arm模板来使用资源及其设置重新创建资源组。这工作得很好。 用例: 一些开发人员访问 Azure 门户并更新某些资源的某些设置。有没有办法获得可以应用于我的模板的精确更改以使这些更改生效? (更新
我有一个包含三个组合框的表单,一个代表该月(可能的)31 天,第二个代表代表月份的 12 个数字,第三个代表与 future 五年相对应的年份值。 我将它们连接在一起形成一个日期 TheDay = C
我有一个打开多个 JIF 的应用程序,但我只想创建 JIF 的单个实例,因此我使用这些函数来检查这一点,并在按下某个键后使用 dispose 关闭 JIF(JDesktopPane. getSelec
我想为一个项目制作一个帐户屏幕,但我对 GUI 还很陌生。这是我第一次使用 JComboBox,但遇到了一些麻烦。我基本上想将 JComboBox 放置在一个盒子内,这将成为我的背景图像的一部分。我尝
我是一名优秀的程序员,十分优秀!