遇到的问题:
- jfinal框架下,ajax提交表单后,后台会返回不同的text信息,前台会根据这些不同的text值来做不同的处理,比如页面跳转或者alert相关信息,这时候$.ajax的dataType无疑是text;
ajax提交代码:
$(this).ajaxSubmit({
url:'${cxt}/ab/bulkImport',
resetForm: false,
dataType: 'text',
success: function (data) {
if('success'==data){
alert("企业联系人导入成功!");
window.location.href='${cxt}/ab/getAddressBookAll';
}else{
alert(data);
return false;
}
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
$.messager.confirm("操作提示", XMLHttpRequest.responseText, function (data) {
if (data) {
window.location.href='${cxt}/ab/getAddressBookAll';
} else {
window.location.href='${cxt}/ab/getAddressBookAll';
}
});
}
});
拦截器代码:
public void intercept(ActionInvocation ai) {
Controller controller = (Controller) ai.getController();
if("/user".equals(ai.getControllerKey())&&"login".equals(ai.getMethodName())
){
ai.invoke();
}else{
Admin admin = (Admin)controller.getSessionAttr("user");
if(admin!=null){
ai.invoke();
}else{
controller.render("/timeout.jsp");
}
}
}
- 但存在另外一种情况,就是后台程序处理前会有一个拦截器,用来判断当前session是否已经过期,而一旦过期,程序会跳转到一个timeout.jsp,是一个画面,这时候如果dataType仍然是text,那么页面不刷新,也不解析,则alert出来的就是整个jsp的源码了,显然是不正确的。
timeout.jsp源码:
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel="StyleSheet"type="text/css" href="${cxt}/css/layout.css" />
<script type="text/javascript">
function reset(){
window.parent.location.href="${cxt}/login.jsp";
}
</script>
</head>
<body>
<div class="timeout_text">
您已经退出登录或者登录超时,请您重新登录。<input type="button" class="btn_reset" value="重新登录" onclick="reset()" />
</div>
</body>
</html>
另外整个程序又不全是ajax提交的,也有一些正常的form提交的,当是正常的form提交的情况下,拦截器却应该是render到一个jsp的。
那么如何处理最好呢?正常的思维就是拦截能够区别是form提交还是ajax提交,然后如果是ajax提交,则返回给前台一个text值,如果是form提交,则直接 render到timeout.jsp。
- 这样,只要再ajax提交中增加一个else if判断,如果是session超时返回则直接跳转到timeout.jsp。
- 如此便解决了问题。
ajax提交代码:
$(this).ajaxSubmit({
url:'${cxt}/ab/bulkImport',
resetForm: false,
dataType: 'text',
success: function (data) {
if('success'==data){
alert("企业联系人导入成功!");
window.location.href='${cxt}/ab/getAddressBookAll';
//添加session超时分支
}else if ('timeout'==data) {
window.location.href='${cxt}/timeout.jsp';
}else{
alert(data);
return false;
}
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
$.messager.confirm("操作提示", XMLHttpRequest.responseText, function (data) {
if (data) {
window.location.href='${cxt}/ab/getAddressBookAll';
} else {
window.location.href='${cxt}/ab/getAddressBookAll';
}
});
}
});
拦截器代码:
public void intercept(ActionInvocation ai) {
Controller controller = (Controller) ai.getController();
if("/user".equals(ai.getControllerKey())&&"login".equals(ai.getMethodName())
){
ai.invoke();
}else{
Admin admin = (Admin)controller.getSessionAttr("user");
if(admin!=null){
ai.invoke();
}else{
//取得请求类型
String requestType = controller.getRequest().getHeader("X-Requested-With");
//如果是ajax提交,则返回text文本:timeout
if("XMLHttpRequest".equals(requestType)){
controller.renderText("timeout");
//如果是form提交,则返回jsp
}else{
controller.render("/timeout.jsp");
}
}
}
}