*请不要问我为什么要这么多代码。我正在运行由其他人开发的网站。很多不是我会做的方式,但它是目前的方式。先谢谢你了。
我们有一个简单的应用程序,允许用户搜索我们学校的课程。该应用程序一切正常,但最近我们将服务器升级到 IIS 7 和 Coldfusion 10。从那时起,一些使用 Internet Explorer 的用户无法使该应用程序正常工作,但问题并不是 100% 普遍存在。事实上非常零星。我已将其缩小到在此过程中未设置的单个会话变量 [SESSION.location],但无法确定在哪里。我将尝试在下面发布相关代码。
Application.CFC 中没有与此变量混淆的内容。有一个处理表单提交的通用标题。
<cftry>
<cfset the_message = (structKeyExists(REQUEST, 'message')) ? REQUEST.message : (isDefined('submitFrmData')) ? submitFrmData() : ''>
<cfif Len(Trim(the_message)) NEQ 0><div id="message">#the_message#</div></cfif>
<cfcatch>#createObject('component','common.err_handler').pageErrHandler(CFCATCH)#</cfcatch>
</cftry>
在表单用于搜索课程的页面上,我转储了 SESSION,我可以看到已设置的 SESSION.location。表单的操作被发送到 search_results.cfm 页面,该页面顶部有以下内容。
public string function submitFrmData() {
//Every time page loads.
dal = CreateObject('component','cfcs.dal');
if(structKeyExists(FORM, 'search_courses')){
if (len(FORM.coursefinder_search) > 2 && arrayLen(REMatch("[%!@##$^&*()]", FORM.coursefinder_search)) < 1) {
if(structKeyExists(session, "location") && structKeyExists(session, "semester_id")){
location('search_results.cfm?fsrch=' & APPLICATION.cFun.structToEncryptedString(FORM) & '&sem_id=#SESSION.semester_id#&loc_id=#SESSION.location#',false);
} else {
location("index.cfm", false);
}
} else if(structKeyExists(FORM, 'dept_id')){
if(structKeyExists(session, "location") && structKeyExists(session, "semester_id")){
location('search_results.cfm?srch='& APPLICATION.cFun.structToEncryptedString(FORM) & '&sem_id=#SESSION.semester_id#&loc_id=#SESSION.location#',false);
} else {
location("index.cfm", false);
}
} else {
location ("index.cfm", false);
}
}
if(structKeyExists(URL, 'srch')){
srch_result = dal.CrsSearch(APPLICATION.cFun.encStringToStruct(URL.srch));
realResults = new query(dbtype="query", QoQsrcTable=srch_result, sql="SELECT DISTINCT COURSEID, sectioncode FROM QoQsrcTable").execute().getResult();
numCoursesFound = (len(trim(realResults.courseid)) NEQ 0) ? realResults.recordCount : 0;
}
if(structKeyExists(URL, 'fsrch')){
srch = APPLICATION.cFun.encStringToStruct(URL.fsrch);
if(!structKeyExists(srch,'coursefinder_search')){
location ("index.cfm", false);
}
srch_result = dal.CrsFreeSearch(srch.COURSEFINDER_SEARCH);
realResults = new query(dbtype="query", QoQsrcTable=srch_result, sql="SELECT DISTINCT COURSEID, sectioncode FROM QoQsrcTable").execute().getResult();
numCoursesFound = (len(trim(realResults.courseid)) NEQ 0) ? realResults.recordCount : 0;
}
return '';
}
所以对我来说这很奇怪,但这就是发生的事情。FORM 被发送到结果页面,其中在调用标头之前定义了 submitFrmData 函数。调用标头并运行 submitFrmData 函数。一旦它进入该函数,我转储 SESSION 并且 SESSION.location 丢失。其他 SESSION 变量仍然存在,但位置丢失。在 OnRequestStart 函数中设置了很多 SESSION 变量,这让我相信所有 SESSION 变量都丢失了,然后在 OnRequestStart 调用上重置。
但是为什么 IE 只会在某些计算机上丢失这些变量。受影响的计算机似乎是在服务器升级之前访问我们的应用程序的计算机,但有些仍然可以正常工作。我使用的计算机在所有版本的 IE 中都很好。我已尝试清除 IE 中的所有缓存数据等,但问题仍然存在。
我今天在这里买了一台有问题的笔记本电脑,希望能够在整个地方转储 SESSION,直到我确切地找出他们在哪一步迷路了,但这并不能解释为什么它只在某些计算机上运行IE并非所有计算机都运行IE。会不会是操作系统问题?