服务端代码:

package com.zhqn.sc.cfg;

import org.springframework.core.MethodParameter;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice; import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.zhqn.sc.entity.dto.ErrorModal;
import com.zhqn.sc.entity.dto.ResponseInfo;
import com.zhqn.sc.entity.dto.ScException; @ControllerAdvice
public class ScResponseAdvise implements ResponseBodyAdvice<Object>{ @Override
public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
return true;
} @Override
public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request,
ServerHttpResponse response) {
ResponseInfo responseInfo = new ResponseInfo();
if(body instanceof ErrorModal) {
responseInfo.setSuccess(false);
}else {
responseInfo.setSuccess(true);
}
responseInfo.setData(body);
if(selectedConverterType.equals(StringHttpMessageConverter.class)) {
return handleString(responseInfo, response);
}
return responseInfo;
} Object handleString(ResponseInfo responseInfo, ServerHttpResponse response) {
ObjectMapper mapper = new ObjectMapper();
response.getHeaders().add(HttpHeaders.CONTENT_TYPE, "application/json;charset=UTF-8");
try {
return mapper.writeValueAsString(responseInfo);
} catch (JsonProcessingException e) {
e.printStackTrace();
ScException.error(e.getMessage());
}
return null;
} }

  

  

package com.zhqn.sc.entity.dto;

public class ResponseInfo {

    private boolean success;

    private Object data;

    public boolean isSuccess() {
return success;
} public void setSuccess(boolean success) {
this.success = success;
} public Object getData() {
return data;
} public void setData(Object data) {
this.data = data;
} }
package com.zhqn.sc.entity.dto;

import java.util.Date;

public class ErrorModal {

    private Date date;

    private Integer code;

    private String errorStr;

    public Integer getCode() {
return code;
} public void setCode(Integer code) {
this.code = code;
} public String getErrorStr() {
return errorStr;
} public void setErrorStr(String errorStr) {
this.errorStr = errorStr;
} public Date getDate() {
return date;
} public void setDate(Date date) {
this.date = date;
} }

返回的数据格式是

{success : true , data : ResponseInfo}代表没有异常时的数据,

{success : false , data : ErrorModal}代表异常时的数据,有全局异常处理器处理返回的,这一步可以参考网上的教程。

这一切看似很完美,但是不管发生不发生异常,response的status都是200,前端jquery ajax函数都走的是success方法,这个函数设计初衷就是处理成功时的数据,失败应该走error方法,因此需要修改jquery ajax方法,可以用js aop思路处理,代码如下:

(function(win){
var ajax = $.ajax;
$.ajax = function(a) {
var oldSuccess = a && a.success && (typeof a.success == "function") ? a.success : null;
var oldError = a && a.error && (typeof a.error == "function") ? a.error : null;
var success = function(response) {
if(response && "data" in response && "success" in response) {
var res = response;
arguments[0] = response.data;
if(res.success == true) {
oldSuccess && oldSuccess.apply(this, arguments);
}else if(oldError){
oldError.apply(this, arguments);
}else {
alertError(res.data);
} }else {
arguments[0] = {errorStr : "数据格式错误!"};
}
};
var error = function(data) {
alertError(data);
}
if(a) {
a.success = success;
a.error = error;
}else {
arguments[0] = {
success : success,
error : error
};
}
ajax.apply(this, arguments);
}
function alertError(data) {
if("status" in data && data.status == 403) {
return;
}
alert(data.errorStr || data.responseJSON && data.responseJSON.errorStr || data.responseText || "服务器连接失败");
}
$(document).ajaxError(function(event,xhr,options,exc){
if(xhr.status == 403 && xhr.getResponseHeader("redirectUrl")) {
window.top.location.href = xhr.getResponseHeader("redirectUrl");
}
});
})(window);

只要引入这段代码,原先的success,error都可以正常使用,另外$.get,$.post,$.getJSON,$.getScript都不会有问题,因为它们最后都要调用$.ajax。

springboot统一ajax返回数据格式,并且jquery ajax success函数修改的更多相关文章

  1. jquery Ajax请求示例,jquery Ajax基本请求方法示例

    jquery Ajax请求示例,jquery Ajax基本请求方法示例 ================================ ©Copyright 蕃薯耀 2018年5月7日 https: ...

  2. Ajax返回数据格式

      Ajax中返回数据的格式 Ajax中常见的返回数据的格式有三种:分别为文本,XML和JSON 返回的文本格式我们在上一堂课Ajax基础介绍中已经介绍过了 Ajax.php Form.html:通过 ...

  3. ajax请求原理及jquery $.ajax封装全解析

    .ajax原理: Ajax的原理简单来说通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,然后用javascript来操作DOM而更新页面.这其中最关键的一步就是从服务器获得 ...

  4. SpringBoot统一处理返回结果和异常情况

    如果文章有帮助到你,还请点个赞或留下评论 原因 在springboot项目里我们希望接口返回的数据包含至少三个属性: code:请求接口的返回码,成功或者异常等返回编码,例如定义请求成功. messa ...

  5. Jquery 日期差函数 修改 对火狐进行兼容

    function DateDiff(sDate1, sDate2) { //sDate1和sDate2是yyyy-MM-dd格式 var aDate, oDate1, oDate2, iDays; a ...

  6. jQuery Ajax 处理 HttpStatus

    今天同事碰到一个问题:当服务端Session失效后用ajax请求数据,页面端无法提示和执行跳转.我最先想到是,在后端用js输出一个跳转.发现输出没有效果,因为ajax是异步请求, 需要在success ...

  7. jQuery ajax 302跨域

    一.ajax 302 ajax用于异步获取服务器数据,但是某天有这么一个使用场景: > 基于安全考虑,登录的用户的信息失效时,系统的所有ajax接口都由服务器直接重定向到系统的登录页面,此时登录 ...

  8. jquery ajax 请求参数详细说明 及 实例

    url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. type: 要求为String类型的参数,请求方式(post或get)默认为get.注意其他http请求方法,例如put和 ...

  9. jQuery Ajax(异步请求)

    jQuery异步请求 原始的异步请求是需要创建的 XMLHttpRequest 对象.(IE5,6不支持)目前很多浏览器都支持XMLHttpRequest对象 jQuery ajax常用的回调函数:b ...

随机推荐

  1. 我的第一个py爬虫-小白(beatifulsoup)

    一.基本上所有的python第一步都是安装.安装 我用到的第三方安装包(beatifulsoup4.re.requests).还要安装lxml 二.找个http开头的网址我找的是url="h ...

  2. Sublime Text3激活及个性化配置

    [TOC] 在我们的开发过程中,选择正确的开发工具会让我们事半功倍.作为后端开发我们熟悉的myeclipse和itellij idea这些工具我也介绍曾介绍过关于他们的安装及破解.但是我们并不能仅仅使 ...

  3. JVM 内存模型概述

    我们都知道,Java程序在执行前首先会被编译成字节码文件,然后再由Java虚拟机执行这些字节码文件从而使得Java程序得以执行.事实上,在程序执行过程中,内存的使用和管理一直是值得关注的问题.Java ...

  4. MySQL-下载-安装-配置-多版本共存-设置密码-破解密码

    目录 MySQL下载安装与配置 官网下载(后面有镜像仓库下载) 从开源镜像仓库下载(快) 开源镜像仓库站点 MySQL的安装 解压 将MySQL添加至环境变量方便启动 配置MySQL 配置编码 安装M ...

  5. c# oracle 数据库连接以及参数化查询

    private string OracleSearchDemo(string cadqueueId) { string address = null; using (OracleConnection ...

  6. Hive 系列(四)—— Hive 常用 DDL 操作

    一.Database 1.1 查看数据列表 show databases; 1.2 使用数据库 USE database_name; 1.3 新建数据库 语法: CREATE (DATABASE|SC ...

  7. 解决Mac下VSCode打开zsh乱码

    1.乱码问题 iTerm2终端使用Zsh,并且配置Zsh主题,该主题主题需要安装字体来支持箭头效果,在iTerm2中设置这个字体,但是VSCode里这个箭头还是显示乱码. iTerm2展示如下: VS ...

  8. Zabbix4.0安装浅谈

    一.此篇文章存在意义 针对超级小白,大神绕过 在zabbix官网https://www.zabbix.com/download里,需要数据库,但是并没有指导小白的我们如何安装数据库,此文章包含了Mys ...

  9. spark读取pg数据库报错操作符不存在

    代码: Properties connectionProperties = new Properties(); connectionProperties.put("user", C ...

  10. Python中模块与包的导入(朴实易懂版的总结)

    这几天,被python包与模块的导入问题,折磨的不行,以前想的很简单,其实不然,经查资料研究,特总结如下: 基本注意点 模块:一般指一个py文件:包:含有许多py文件的文件夹,含有 或不含有(Pyth ...