*请不要问我为什么这个代码很多。我正在运行由其他人开发的网站。很多不是我想做的方式,但它是目前的方式。先谢谢你。
我们有一个简单的应用程序,允许用户在我们学校搜索课程。应用程序一切都运行良好,但最近我们将服务器升级到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的计算机。这可能是操作系统问题吗?
答案 0 :(得分:1)
我们作为子域运行。主域名也使用了Coldfusion,并使用了与我们发生冲突的站点范围的cookie。这导致了这个问题,并且已经解决了。