Struts2 jquery 超时未触发事件的选项卡式面板
Struts2 jquery tabbed panel on timeout not firing events
页面上有 <sj:tabbedppanel>
。
会话超时后,尝试单击选项卡式面板的另一个选项卡应将用户重定向到登录页面。
<sj:tabbed>
面板未触发 onErrorTopics
。请参阅下文并指导我如何解决此问题。我在 fire bug 中看到抛出了 403 错误,但我无法在 jsp 中捕捉到它。需要帮助。
struts.xml
<action name="secondPanel" class="com.xxx.secondPanelAction">
<interceptor-ref name="sampleDefaultStack" />
<result>/jsp/secondPanel.jsp</result>
<result name="login" type="httpheader">
<param name="error">403</param>
<param name="errorMessage">User session expired </param>
</result>
</action>
jsp
<sj:tabbedpanel id="remotetabs" selectedTab="0" show="true" hide="'fade'" collapsible="true" sortable="true" onErrorTopics="loadError">
<sj:tab id="tab2" href="%{createUrl}" key="label.create" onErrorTopics="loadError"/>
<sj:tab id="tab1" href="%{updateUrl}" key="label.update" onErrorTopics="loadError"/>
</sj:tabbedpanel>
<script type="text/javascript" >
$(document).ready(function() {
$.subscribe('loadError', function(event, data) { alert('in error');
var status = event.originalEvent.status;
if(status == 403 ) {
window.location.href = "/Sample/login.action";
}
});
</script>
我做了一些测试,这里是我的发现。
让我们尝试一个简单的 sj:div
,这更简单一些。如果您将 httpheader
结果与 status:403
一起使用,那么您可以使用类似的东西:
<sj:div href="/security/login.ib" onErrorTopics="loadError" targets="test">Test</sj:div>
$.subscribe('loadError', function(event, data) {
alert('some error happend');
if(event.originalEvent.request.status){
var status = event.originalEvent.request.status;
alert(status);
}
});
请注意,您应该使用 event.originalEvent.request.status
返回sj:tab
....
sj:tab 无法与 onAlwaysTopics
或 onErrorTopics
一起使用,这似乎是一个错误。但是,您可以使用 onCompleteTopics
或 onChangeTopics
.
<sj:tabbedpanel id="remotetabs" show="true" hide="'fade'" collapsible="true" sortable="true" onCompleteTopics="loadError" >
但是你不能使用httpheader
结果。使用 status:403
,loadError
根本不会被调用。
因此您可以在 jsp 和 return 中使用 onCompleteTopics
和 json,这会让您知道应该做什么。
或者您可以使用
$(document).ajaxError( function(e, xhr, settings, exception) {
if (xhr.status == 403) {
//Do what you want
}
}
请注意,上面的 ajaxError
将在每个 ajaxError
时被调用,而不仅仅是在您更改选项卡时。也许您使用 settings.url
可以提供帮助。
页面上有 <sj:tabbedppanel>
。
会话超时后,尝试单击选项卡式面板的另一个选项卡应将用户重定向到登录页面。
<sj:tabbed>
面板未触发 onErrorTopics
。请参阅下文并指导我如何解决此问题。我在 fire bug 中看到抛出了 403 错误,但我无法在 jsp 中捕捉到它。需要帮助。
struts.xml
<action name="secondPanel" class="com.xxx.secondPanelAction">
<interceptor-ref name="sampleDefaultStack" />
<result>/jsp/secondPanel.jsp</result>
<result name="login" type="httpheader">
<param name="error">403</param>
<param name="errorMessage">User session expired </param>
</result>
</action>
jsp
<sj:tabbedpanel id="remotetabs" selectedTab="0" show="true" hide="'fade'" collapsible="true" sortable="true" onErrorTopics="loadError">
<sj:tab id="tab2" href="%{createUrl}" key="label.create" onErrorTopics="loadError"/>
<sj:tab id="tab1" href="%{updateUrl}" key="label.update" onErrorTopics="loadError"/>
</sj:tabbedpanel>
<script type="text/javascript" >
$(document).ready(function() {
$.subscribe('loadError', function(event, data) { alert('in error');
var status = event.originalEvent.status;
if(status == 403 ) {
window.location.href = "/Sample/login.action";
}
});
</script>
我做了一些测试,这里是我的发现。
让我们尝试一个简单的 sj:div
,这更简单一些。如果您将 httpheader
结果与 status:403
一起使用,那么您可以使用类似的东西:
<sj:div href="/security/login.ib" onErrorTopics="loadError" targets="test">Test</sj:div>
$.subscribe('loadError', function(event, data) {
alert('some error happend');
if(event.originalEvent.request.status){
var status = event.originalEvent.request.status;
alert(status);
}
});
请注意,您应该使用 event.originalEvent.request.status
返回sj:tab
....
sj:tab 无法与 onAlwaysTopics
或 onErrorTopics
一起使用,这似乎是一个错误。但是,您可以使用 onCompleteTopics
或 onChangeTopics
.
<sj:tabbedpanel id="remotetabs" show="true" hide="'fade'" collapsible="true" sortable="true" onCompleteTopics="loadError" >
但是你不能使用httpheader
结果。使用 status:403
,loadError
根本不会被调用。
因此您可以在 jsp 和 return 中使用 onCompleteTopics
和 json,这会让您知道应该做什么。
或者您可以使用
$(document).ajaxError( function(e, xhr, settings, exception) {
if (xhr.status == 403) {
//Do what you want
}
}
请注意,上面的 ajaxError
将在每个 ajaxError
时被调用,而不仅仅是在您更改选项卡时。也许您使用 settings.url
可以提供帮助。