package com.shuidi.aop;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import com.shuidi.common.util.LoggerUtil;
/**
* Aop統一日誌管理
* @author 李修睿
* @Date 2019年8月22日
*/
@Aspect
@Component
public class LogResult {
/**
* 保存信息到當前線程
*/
public static final ThreadLocal<Map<String,String>> INFO=new ThreadLocal<>();
Logger log = LoggerUtil.getLogger(LogResult.class);
@Pointcut("execution(public * com.shuidi.*.controller.*.*(..))")
public void webLog(){
}
/**
* 日誌記錄請求內容
* @param joinPoint
* @throws Throwable
* 2020年2月6日 上午10:40:16
*/
@Before("webLog()")
public void doBefore(JoinPoint joinPoint) throws Throwable {
// 接收到請求,記錄請求內容
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
Signature signature = joinPoint.getSignature();
// MethodSignature methodSignature = (MethodSignature) signature;
// String[] names = methodSignature.getParameterNames();
// Object[] args = joinPoint.getArgs();
String method= signature.getDeclaringTypeName() + "." +signature.getName();
String args=Arrays.toString(joinPoint.getArgs());
Map<String, String> map = new HashMap<String, String>();
map.put("method", method);
map.put("args", args);
INFO.set(map);
// 記錄下請求內容
log.info("URL : " + request.getRequestURL().toString());
log.info("HTTP_METHOD : " + request.getMethod());
log.info("IP : " + request.getRemoteAddr());
log.info("CLASS_METHOD : " +method);
log.info("ARGS : " + args);
}
/**
* 日誌記錄返回結果
* @param ret
* @throws Throwable
*/
@AfterReturning(returning = "ret", pointcut = "webLog()")
public void doAfterReturning(Object ret) throws Throwable {
INFO.remove();
// 處理完請求,返回內容
if(null==ret){
log.info("返回結果 : null" );
}else{
log.info("返回結果 : " +ret.toString() );
}
}
}
package com.shuidi.common.result;
import com.alibaba.fastjson.JSON;
/**
* 統一返回模型
* @author 李修睿
* @Date 2019年8月22日
* @param <T>
*/
public class Result<T> {
private int code;
private String message;
private T datas;
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public T getDatas() {
return datas;
}
public void setDatas(T datas) {
this.datas = datas;
}
public String toString(){
return JSON.toJSONString(this);
}
}
package com.shuidi.common.result;
import java.util.List;
import com.shuidi.common.myException.CustomException;
public class ResultUtil{
public static final String CODE_REDBAG_CANT_BUY = "-1";
public static final int CODE_SUCCESS = 1;
public static final int CODE_FAIL = -1;
public static final int CODE_NULL = 0;
public static final String MSG_SUCCESS = "成功";
public static final String MSG_FAIL = "失敗";
public static final String MSG_NULL = "無記錄";
public static final String MSG_ERROR = "未知錯誤";
public static final int DB_RETURN_FAIL = 0;
/**
* 正常返回
* @param t
* @return
*/
public static <T> Result<T> out(T t){
Result<T> res = new Result<>();
if(null==t){
res.setCode(CODE_NULL);
res.setMessage(MSG_NULL);
}else if(t instanceof List){
if(((List<?>) t).isEmpty()){
res.setCode(CODE_NULL);
res.setMessage(MSG_NULL);
}else{
res.setCode(CODE_SUCCESS);
res.setMessage(MSG_SUCCESS);
}
}else{
res.setCode(CODE_SUCCESS);
res.setMessage(MSG_SUCCESS);
}
res.setDatas(t);
return res;
}
/**
* 返回int
* @param t
* @return
*/
public static Result<Integer> out(int t){
Result<Integer> res = new Result<>();
if(t<1){
res.setCode(CODE_NULL);
res.setMessage(MSG_FAIL);
}else{
res.setCode(CODE_SUCCESS);
res.setMessage(MSG_SUCCESS);
}
res.setDatas(t);
return res;
}
/**
* 返回Sring
* @param t
* @return
*/
public static Result<String> out(String t){
Result<String> res = new Result<>();
if(null==t||"".equals(t)){
res.setCode(CODE_NULL);
res.setMessage(MSG_FAIL);
}else{
res.setCode(CODE_SUCCESS);
res.setMessage(MSG_SUCCESS);
}
res.setDatas(t);
return res;
}
/**
* 返回對象
* @param t
* @return
*/
public static <T> Result<T> out(T t,int code ,String msg){
Result<T> res = new Result<>();
res.setCode(code);
res.setMessage(msg);
res.setDatas(t);
return res;
}
/**
* 返回異常
* @param t
* @return
*/
public static <T> Result<T> outError(T t){
Result<T> res = new Result<>();
if(t instanceof CustomException){//返回自定義異常
CustomException c =( CustomException)t;
res.setCode(c.getCode());
res.setMessage(c.getMessage());
}else{//返回系統異常
res.setCode(CODE_FAIL);
res.setMessage(MSG_ERROR);
}
return res;
}
}
package com.shuidi.exceptionhandler;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import com.shuidi.aop.LogResult;
import com.shuidi.common.myException.CustomException;
import com.shuidi.common.result.Result;
import com.shuidi.common.result.ResultUtil;
/**
* controller 增強器
*
* @author sam
* @since 2017/7/17
*/
@ControllerAdvice
public class MyControllerAdvice {
private static final Logger log= LoggerFactory.getLogger(MyControllerAdvice.class);
/**
* 全局異常捕捉處理
* @param ex
* @return
*/
@ResponseBody
@ExceptionHandler(value = Exception.class)
public Result<Exception> errorHandler(Exception ex) {
HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
log.error("URL:"+request.getRequestURI());
log.error("HTTP_METHOD : " + request.getMethod());
log.error("IP : " + request.getRemoteAddr());
Map<String, String> map = LogResult.INFO.get();
if(null!=map){
log.error("CLASS_METHOD : " +map.get("method"));
log.error("ARGS : " + map.get("args"));
LogResult.INFO.remove();
}
log.error("CaseBy : " + ex.getCause());
Result<Exception> res= ResultUtil.outError(ex);
log.error("返回結果:"+res.toString(),ex);
return res;
}
/**
* 攔截捕捉自定義異常 MyException.class
* @param ex
* @return
*/
@ResponseBody
@ExceptionHandler(value = CustomException.class)
public Result<CustomException> myErrorHandler(CustomException ex) {
HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
log.error("URL:"+request.getRequestURI());
log.error("HTTP_METHOD : " + request.getMethod());
log.error("IP : " + request.getRemoteAddr());
Map<String, String> map = LogResult.INFO.get();
if(null!=map){
log.error("CLASS_METHOD : " +map.get("method"));
log.error("ARGS : " + map.get("args"));
LogResult.INFO.remove();
}
log.error("CaseBy : " + ex.getCause());
Result<CustomException> res= ResultUtil.outError(ex);
log.error("返回結果:"+res.toString());
return res;
}
}
package com.shuidi.common.util;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class LoggerUtil {
public static Logger getLogger(Class<?> clazz){
return LoggerFactory.getLogger(clazz);
}
}