jfinal框架中ajax提交返回类型datatype不确定时。。。

原创 2015年07月08日 14:43:52

遇到的问题:
- 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");
                } 
           }
        }
    }

ajax中dataType中的类型

dataType 类型:String 预期服务器返回的数据类型。如果不指定,jQuery 将自动根据 HTTP 包 MIME 信息来智能判断,比如 XML MIME 类型就被识别为 XML。在 1....
  • yzj578492228
  • yzj578492228
  • 2014年10月16日 09:53
  • 16597

jQuery的Ajax中dataType选项用于设置返回值类型

jQuery的Ajax中dataType选项用于设置返回值类型 [jQuery的Ajax文档] http://docs.jquery.com/Ajax/jQuery.ajax#opt...
  • hu_zhenghui
  • hu_zhenghui
  • 2007年09月24日 23:10
  • 17659

jquery中ajax的dataType属性包括哪几项

dataType 类型:String 预期服务器返回的数据类型。如果不指定,jQuery 将自动根据 HTTP 包 MIME 信息来智能判断,比如 XML MIME 类型就被识别为 XML。在...
  • qq_30979185
  • qq_30979185
  • 2017年04月21日 07:49
  • 617

Jquery ajax请求中datatype的含义

我的风格就是  列出例子,不过多的讲理论。 一切从一个普通的前端ajax请求jspringMVC后端的例子开始, 前端jquery ajax 请求: $.ajax({ ...
  • u013476542
  • u013476542
  • 2017年03月11日 11:23
  • 10581

ajax请求中contentType与dataType区别

ajax请求中contentType与dataType区别
  • john1337
  • john1337
  • 2017年03月08日 09:51
  • 4783

Ajax数据返回格式问题解决

Ajax数据返回格式问题解决      服务端返回的数据格式为:      response.setContentType("text/xml;charset=utf-8");      设置发送到客...
  • sunhuaqiang1
  • sunhuaqiang1
  • 2016年05月11日 14:20
  • 44597

《走过的路 踩过的坑》--jQuery ajax dataType返回出错问题及解决

1需求 目前在维护一个项目。接到一个需求是要在某个保存动作之前增加一步校验,如果校验通过则可以进行保存,否则返回错误提示并阻止保存动作。 因为是寄存项目,保存动作是通过js提交表单发送请求动作,所...
  • Return__Null
  • Return__Null
  • 2016年07月29日 14:43
  • 843

jQuery的ajax函数,将dataType="json",执行后却进入error函数中

jQuery的ajax函数,将dataType="json",执行后却进入error函数中 什么原因? 但是我后台返回的明明就是json格式的啊? 最后上网找了好久,也是无果。 ...
  • Ideality_hunter
  • Ideality_hunter
  • 2017年06月06日 16:14
  • 287

关于ajax的dataType类型为text返回值乱码的问题

下午在关于action里返回中文字符串传至前台乱码,花了很长时间用了网上很多方法都没解决问题,最后通过同事帮助才得已解决,只需在控制层对应的action中添加 @RequestMapping(val...
  • aluckyumi
  • aluckyumi
  • 2017年08月17日 18:00
  • 395

ajax提交返回boolean类型

function validateEnameExsit() { var ename = $("#ename").val(); if($.trim(ename)=='') {     $("#re...
  • u010974598
  • u010974598
  • 2013年08月26日 13:19
  • 2876
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:jfinal框架中ajax提交返回类型datatype不确定时。。。
举报原因:
原因补充:

(最多只允许输入30个字)