统一处理ajax和普通的http请求
ajax请求就返回数据提示出错,普通http请求就跳转到错误页面:
import com.yama.util.ServerResponse;
import com.yama.util.log.ExceptionUtil;
import org.apache.ibatis.annotations.Param;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Description;
import org.springframework.http.MediaType;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.http.server.ServletServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author: Mr.Zzw
* @modified by:
* @description: deal with exception
* @create: 2018-04-23 14:11
**/
@ControllerAdvice
public class GlobalExceptionHandler {
@Autowired
private MappingJackson2HttpMessageConverter jsonConverter;
public static final String ERROR_VIEW = "error";
Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);
@ExceptionHandler(value = Exception.class)
public Object errorHandler(HttpServletRequest request,
HttpServletResponse response,Exception e)throws Exception {
e.printStackTrace();
if(isAjax(request)){
return ajaxException(e,request,response);
}else{
return httpException(e,request);
}
}
/**
* @Description: 判断是否来自于ajax请求
* @Param: [httpRequest]
* @return: boolean
* @Author: Mr.Zheng
* @Date: 2018/4/23
*/
public static boolean isAjax(HttpServletRequest httpRequest){
return (httpRequest.getHeader("X-Requested-With") != null
&&"XMLHttpRequest".equals(httpRequest.getHeader("X-Requested-With").toString()));
}
/**
* @Description: ajax 请求出错,返回数据
* @Param: [e]
* @return: com.yama.util.ServerResponse
* @Author: Mr.Zheng
* @Date: 2018/5/3
*/
public ServerResponse ajaxException(Exception e,HttpServletRequest request,HttpServletResponse response) throws IOException{
log.error("ajax请求出错,1:错误url"+request.getRequestURI()+"--2.错误原因:", e);
//由于@ControllerAdvice是返回页面,@RestControllerAdvice 返回json,所有这里要设置返回的类型
jsonConverter.write( ServerResponse.createByErrorMessage(e.getMessage()), MediaType.APPLICATION_JSON, new ServletServerHttpResponse(response));
return null;
}
/**
* @Description: 普通http 请求出错,返回页面
* @Param: [e, request]
* @return: org.springframework.web.servlet.ModelAndView
* @Author: Mr.Zheng
* @Date: 2018/5/3
*/
public ModelAndView httpException(Exception e,HttpServletRequest request) {
ModelAndView mav = new ModelAndView();
mav.addObject("exception",e);
mav.addObject("url",request.getRequestURI());
mav.setViewName(ERROR_VIEW);
log.error("普通http请求出错,1:错误url"+request.getRequestURI()+"--2.错误原因:", e);
return mav;
}
}
@JsonSerialize(include =JsonSerialize.Inclusion.NON_NULL)
public class ServerResponse<T> implements Serializable {
private int status;
private String msg;
private T data;
private ServerResponse(int status){
this.status=status;
}
public ServerResponse(int status,T data){
this.status=status;
this.data=data;
}
private ServerResponse(int status,String msg,T data){
this.status=status;
this.msg=msg;
this.data=data;
}
public ServerResponse(int status,String msg){
this.status=status;
this.msg=msg;
}
public static void main(String[] args) {
ServerResponse s1=new ServerResponse(1,new Object());
ServerResponse s2=new ServerResponse(1,"abc");
System.out.println( "ccc");
}
@JsonIgnore
public boolean isSuccess(){
return this.status==ResponseCode.SUCCESS.getCode();
}
public int getStatus(){
return status;
}
public T getData(){
return data;
}
public String getMsg(){
return msg;
}
public static<T> ServerResponse<T> createBySuccess(){
return new ServerResponse<T>(ResponseCode.SUCCESS.getCode() );
}
public static<T> ServerResponse<T> createBySuccessMessage(String msg){
return new ServerResponse<T>(ResponseCode.SUCCESS.getCode(),msg);
}
public static<T> ServerResponse<T> createBySuccess(T data){
return new ServerResponse<T>(ResponseCode.SUCCESS.getCode(),data);
}
public static<T> ServerResponse<T> createBySuccess(String msg,T data){
return new ServerResponse<T>(ResponseCode.SUCCESS.getCode(),msg,data);
}
public static <T> ServerResponse<T> createByError(){
return new ServerResponse<T>(ResponseCode.ERROR.getCode(),ResponseCode.ERROR.getDesc());
}
public static <T> ServerResponse<T> createByErrorMessage(String errorMessage){
return new ServerResponse<T>(ResponseCode.ERROR.getCode(),errorMessage);
}
public static <T> ServerResponse<T> createByErrorErrorCodeMessage(int errorCode,String errorMessage){
return new ServerResponse<T>(errorCode,errorMessage);
}
@Override
public String toString() {
return "ServerResponse{" +
"status=" + status +
", msg='" + msg + '\'' +
", data=" + data +
'}';
}
}