springboot统一ajax返回数据格式,并且jquery ajax success函数修改
服务端代码:
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函数修改的更多相关文章
- jquery Ajax请求示例,jquery Ajax基本请求方法示例
jquery Ajax请求示例,jquery Ajax基本请求方法示例 ================================ ©Copyright 蕃薯耀 2018年5月7日 https: ...
- Ajax返回数据格式
Ajax中返回数据的格式 Ajax中常见的返回数据的格式有三种:分别为文本,XML和JSON 返回的文本格式我们在上一堂课Ajax基础介绍中已经介绍过了 Ajax.php Form.html:通过 ...
- ajax请求原理及jquery $.ajax封装全解析
.ajax原理: Ajax的原理简单来说通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,然后用javascript来操作DOM而更新页面.这其中最关键的一步就是从服务器获得 ...
- SpringBoot统一处理返回结果和异常情况
如果文章有帮助到你,还请点个赞或留下评论 原因 在springboot项目里我们希望接口返回的数据包含至少三个属性: code:请求接口的返回码,成功或者异常等返回编码,例如定义请求成功. messa ...
- Jquery 日期差函数 修改 对火狐进行兼容
function DateDiff(sDate1, sDate2) { //sDate1和sDate2是yyyy-MM-dd格式 var aDate, oDate1, oDate2, iDays; a ...
- jQuery Ajax 处理 HttpStatus
今天同事碰到一个问题:当服务端Session失效后用ajax请求数据,页面端无法提示和执行跳转.我最先想到是,在后端用js输出一个跳转.发现输出没有效果,因为ajax是异步请求, 需要在success ...
- jQuery ajax 302跨域
一.ajax 302 ajax用于异步获取服务器数据,但是某天有这么一个使用场景: > 基于安全考虑,登录的用户的信息失效时,系统的所有ajax接口都由服务器直接重定向到系统的登录页面,此时登录 ...
- jquery ajax 请求参数详细说明 及 实例
url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. type: 要求为String类型的参数,请求方式(post或get)默认为get.注意其他http请求方法,例如put和 ...
- jQuery Ajax(异步请求)
jQuery异步请求 原始的异步请求是需要创建的 XMLHttpRequest 对象.(IE5,6不支持)目前很多浏览器都支持XMLHttpRequest对象 jQuery ajax常用的回调函数:b ...
随机推荐
- Android buildType混淆代码
[话题引入] ①在Android开发完成,我们会将代码打包成APK文件.选择 菜单栏 Build --> Build APK ②将查看视图切换到 Project 模式,文件夹下有一个debug模 ...
- 【Java例题】5.1 多项式计算
1. 计算下列多项式的值. pn=an*x^n+...+a1*x+a0其中,"^"表示乘方. x.n以及ai(i=0,1,...,n-1)由键盘输入. package chapte ...
- 【Kubernetes 系列五】在 AWS 中使用 Kubernetes:EKS
目录 1. 概述 2. 版本 3. 预备 3.1. 操作环境 3.2. 角色权限 3.2.1. CloudFormation 完全权限 3.2.2. EKS 读写权限 3.2.3. EC2 相关权限 ...
- 详解InheritableThreadLocal类的使用与原理
在Java并发编程中,InheritableThreadLocal 与 ThreadLocal 都可以用于线程间通信,不同的是 InheritableThreadLocal 继承了 ThreadLoc ...
- ZooKeeper系列(二)—— Zookeeper 单机环境和集群环境搭建
一.单机环境搭建 1.1 下载 下载对应版本 Zookeeper,这里我下载的版本 3.4.14.官方下载地址:https://archive.apache.org/dist/zookeeper/ # ...
- 决策树ID3原理及R语言python代码实现(西瓜书)
决策树ID3原理及R语言python代码实现(西瓜书) 摘要: 决策树是机器学习中一种非常常见的分类与回归方法,可以认为是if-else结构的规则.分类决策树是由节点和有向边组成的树形结构,节点表示特 ...
- Hyper-V修改Docker for Windows存储设置
自从Win10安装了Docker for Windows后,C盘容量爆炸,必须做一波迁移了.我的Docker使用的是Windows的Hyper-V虚拟机,于是google了一番找到以下一篇文章 doc ...
- 使用.Net Core CLI命令dotnet new创建自定义模板
文章起源来自一篇博客:使用 .NET CORE 创建 项目模板,模板项目,Template - DeepThought - 博客园 之前使用Abp的时候就很认同Abp创建模板项目的方式.想不到.Net ...
- Scrapy框架解读
1. Scrapy组件a. 主体部分i. 引擎(Scrapy):处理整个系统的数据流处理,触发事务(框架核心)ii. 调度器(Scheduler):1) 用来接受引擎发过来的请求, 压入队列中, 并在 ...
- Java多线程之线程的生命周期
Java多线程之线程的生命周期 一.前言 当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态.在线程的生命周期中,它要经过新建(New).就绪(Runnable).运行(R ...