服务端代码:

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. Python基础编程 内置函数

    内置函数 内置函数(一定记住并且精通) print()屏幕输出 int():pass str():pass bool():pass set(): pass list() 将一个可迭代对象转换成列表 t ...

  2. React 基于antd+video.js实现m3u8格式视频播放及实时切换

    文档连接地址(官网看起麻烦,看中文别人整理好的)https://blog.csdn.net/a0405221/article/details/80923090 React项目使用  安装依赖 npm ...

  3. 【Java例题】5.5 两个字符串中最长公共子串

    5. 查找两个字符串中含有的最长字符数的公共子串. package chapter5; import java.util.Scanner; public class demo5 { public st ...

  4. 从SpringBoot构建十万博文聊聊缓存穿透

    前言 在博客系统中,为了提升响应速度,加入了 Redis 缓存,把文章主键 ID 作为 key 值去缓存查询,如果不存在对应的 value,就去数据库中查找 .这个时候,如果请求的并发量很大,就会对后 ...

  5. c#引用本地dll发布后运行exe错误

    在config 文件夹 configuration 配置节点下面 添加 <runtime> <gcConcurrent enabled="true" /> ...

  6. Java - 手动解析不带引号的JSON字符串

    目录 1 需求说明 2 解析代码 2.1 实现思路 2.2 详细代码 2.3 测试样例 1 需求说明 项目中遇到了一批不带引号的类JSON格式的字符串: {Name:Heal,Age:20,Tag:[ ...

  7. laravel为模型中所有查询统一添加WHERE条件

    在使用laravel开发web系统的过程,需要在model处为该模型统一添加一个条件或者多个条件,研究了一个laravel的模型类,发现model中有个方法是构建查询的,方法如下: /** * Reg ...

  8. Django-用户-组-权限

    前言 RBAC(Role-Based Access Control,基于角色的访问控制)就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成“用户-角 ...

  9. 从0开始学Git——Git的常见操作

    Git常用命令 创建Git版本库 git init [目录]#创建目录版本库, 不写的话是当前目录 该命令会在目录中创建一个名为.git的隐藏目录 文件提交 添加文件: git add 文件名 #添加 ...

  10. 微信小程序, 解析↵换行

    获取到json中的数据,通过“\n”转义,此时我们需要通过正则表达式来替换一下 replace(/↵/g, '\n');   在页面中可以这样 <text class="test-ti ...