2016-10-06 2 views
0

내가 오류는 이것이다 :세션이 구조체가 아닙니다.

Element USER is undefined in a Java object of type class [Ljava.lang.String;

내가 이런 일 할 때이 오류가 있습니다 얻을 코드의 라인 :

SESSION.user.functionName()

그것은 무작위의를 내가 가정이 일어나고있다 사용자의 세션이 만료 된 후 내 문제는 우선, SESSION 범위가 항상 구조가 아닌가요? 어떻게/왜 ColdFusion이 문자열이라고 생각합니까?

상관없이 내 주요 문제는 CFWheels를 사용하고 있습니다. 모든 컨트롤러는 물론 메인 Controller.cfc을 확장하고 모든 컨트롤러 (공용 컨트롤러 제외)는 checkLogin 기능을 통해 필터합니다. 즉, 함수는이 있습니다 usersession에 존재하고 있지 방법 중 하나를 수행하거나 다른 경우 내가 다른 곳을 보낸다 경우 기능의이 부분에서

<cfif !structKeyExists(session, "user")> 
    <cfif !structKeyExists(params,'layout') || params.layout EQ true> 
       <cfset redirectTo(route="home",error="You must be logged in to continue.") /> 
    <cfelse> 
     <cfset flashInsert(error="You session has expired and you must login to continue. <a href=''>Reload the Page</a> to login.") /> 
     <cfset redirectTo(controller="Shared",action="ajaxError") /> 
    </cfif> 
</cfif> 

, 내가 명시 적으로 확인합니다. session이 어쨌든 문자열 일 때 코드가이 부분을 지나면 어떻게 실패합니까?

SESSION.user 개체의 다양한 항목이 올바른지 확인하기 전에 오류 줄에 도달하기 전에 여러 가지 다른 장소가 있습니다.

+0

(편집) 오류 메시지는'user' 요소가'session'이 아닌 문자열이라고 말합니다. 허용 된 오류 메시지가 항상 100 % 정확하지는 않습니다. 키가 전혀 존재하지 않는다는 것을 의미 할 수도 있습니다. 'session.someKeyThatDoesNotExist.functionName()'에서 같은 오류가 발생합니다. – Leigh

+0

'user'가 객체에서 정의되지 않았다는 것을 말하는 것이 아닙니까? String 클래스의 객체입니까? – Leeish

+0

당신이 옳다면, '입니다. 그럼에도 불구하고 사용자 객체의 메소드를 사용하여 내 코드의 다른 부분을 지나쳐 버릴 수 있었는지 이해하지 못하고 단지 뷰에 도달 한 다음 실패합니다. – Leeish

답변

0

아약스 요청에서 무슨 일이 일어나고 있었습니까? 일부 Ajax 요청은 보고서로드 및 쿼리에 몇 초가 걸릴 수 있습니다 (특히 일부 캐싱이 발생하기 전에). 사용자가 ajax 호출을 실행 한 다음 로그 아웃하면 기술적으로 컨트롤러에 대한 모든 권한 확인을 통해 요청이 이루어 지지만 (단지 밀리 초가 소요됨) 컨트롤러에서 사용자가 로그 아웃 한 모델에서 데이터를 가져 오는 동안 요청이 처리 될 수 있습니다.

그러면보기를로드 할 준비가 될 때까지 세션이 지워집니다. 세션 범위에서 아무 것도 사용하면 오류가 발생합니다.

컨트롤러 조치 후에 실행되는 필터를 추가하여 세션 범위가 아직 있는지 확인하여 문제를 해결할 것입니다. 그렇지 않은 경우 요청을 중단합니다. 내 견해에 모델 논리가 없지만 때로 SESSION.user 범위의 메서드를 참조합니다. 아마 순수 MVC가 아닙니다.

컨트롤러의 일부가 완료되기 전에 로그 아웃이 발생하는 경우 사용자가 실제로 볼 수 없으므로 이러한 오류가 발생할 수 있으므로 무시하고 무시할 것입니다.

+0

Grrr ...보기가 실행 된 후에 필터가 실행 된 것처럼 보입니다. 이것을 잡는 방법을 모릅니다. – Leeish

+0

세션 변수 사용을 최소화하는 또 다른 이유. –

+0

세션 종료 후 ../wheels/events/onsessionend.cfm 파일에서 코드를 실행할 수 있습니다. 세션이 끝나면 코드가 실행됩니다. 세션 범위의 모든 값은 인수 범위에서 사용할 수 있습니다. –