This commit is contained in:
xiangwb
2017-11-03 15:41:52 +08:00
commit 79549977df
58 changed files with 4342 additions and 0 deletions
@@ -0,0 +1,87 @@
package com.xwbing.handler;
import com.alibaba.fastjson.JSONObject;
import com.xwbing.exception.BusinessException;
import com.xwbing.util.JSONObjResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.validation.BindException;
import org.springframework.validation.ObjectError;
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.ResponseStatus;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
* 说明: GlobalExceptionHandler
* 项目名称: sbdemo
* 创建时间: 2017/5/10 16:36
* 作者: xiangwb
*/
// 作用在所有注解了@RequestMapping的控制器的方法上
@ControllerAdvice
public class GlobalExceptionHandler {
private final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);
/**
* 自定义业务异常
*
* @param request
* @param ex
* @return
*/
// 拦截处理控制器里对应的异常。
@ExceptionHandler(value = BusinessException.class)
// 返回给页面200状态码
@ResponseStatus(value = HttpStatus.OK)
@ResponseBody
public JSONObject handlerGuideException(HttpServletRequest request,
Exception ex) {
logger.error(ex.getMessage());
return JSONObjResult.toJSONObj(ex.getMessage());
}
/**
* 表单检验(validator) 异常
*
* @param request
* @param response
* @param ex
* @return
*/
@ExceptionHandler(value = BindException.class)
@ResponseBody
public JSONObject handlerBindException(HttpServletRequest request,
HttpServletResponse response, BindException ex) {
List<ObjectError> list = ex.getAllErrors();
StringBuffer stringBuffer = new StringBuffer();
for (ObjectError objectError : list) {
if (stringBuffer.length() > 0)
stringBuffer.append(" && ");
stringBuffer.append(objectError.getDefaultMessage());
}
logger.error(stringBuffer.toString());
response.setStatus(HttpStatus.OK.value());
return JSONObjResult.toJSONObj(stringBuffer.toString());
}
/**
* @param request
* @param ex
* @return
*/
@ExceptionHandler(value = Exception.class)
@ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR)
@ResponseBody
public JSONObject handlerException(HttpServletRequest request,
Exception ex) {
logger.error(ex.getMessage());
return JSONObjResult.toJSONObj("系统异常,请联系管理员");
}
}
@@ -0,0 +1,44 @@
package com.xwbing.handler;
import com.xwbing.configuration.DispatcherServletConfig;
import com.xwbing.constant.CommonConstant;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.HashSet;
import java.util.Set;
/**
* 说明: 登录拦截器
* 项目名称: sbdemo
* 创建时间: 2017/5/10 16:36
* 作者: xiangwb
*/
public class LoginInterceptor extends HandlerInterceptorAdapter {
private final Logger logger = LoggerFactory.getLogger(DispatcherServletConfig.class);
private static final Set<String> set = new HashSet<>();//拦截器白名单
static {
set.add("/v2/api-docs");
set.add("/servlet/captchaCode");
set.add("/swagger-ui.html");
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String servletPath = request.getServletPath();
if(!set.contains(servletPath) && !servletPath.contains("login")){
HttpSession session = request.getSession();
if (session.getAttribute(CommonConstant.SESSION_CURRENT_USER)!=null) {
// TODO: 2017/5/15
return true;
}else {
// TODO: 2017/10/3
return false;
}
}
return true;
}
}
@@ -0,0 +1,122 @@
package com.xwbing.handler;
import com.xwbing.annotation.LogInfo;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
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.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.lang.reflect.Method;
/**
* 说明: web层日志记录切面
* 项目名称: sbdemo
* 创建时间: 2017/5/10 16:34
* 作者: xiangwb
*/
@Aspect
@Component
public class WebLogAspect {
private final Logger logger = LoggerFactory.getLogger(WebLogAspect.class);
ThreadLocal<Long> startTime = new ThreadLocal<>();
@Pointcut("within(com.xwbing.controller..*) && @annotation(logInfo)")
public void pointCutWithMsg(LogInfo logInfo) {
}
@Pointcut("within(com.xwbing.controller..*)")
public void pointCut() {
}
/**
* 前置通知
*
* @param logInfo
*/
@Before("pointCutWithMsg(logInfo)")
public void before(JoinPoint joinPoint, LogInfo logInfo) {
startTime.set(System.currentTimeMillis());
String info = logInfo.value();
String targetName = joinPoint.getTarget().getClass().getName();
String methodName = joinPoint.getSignature().getName();
logger.info("{} {} : {} started", targetName, methodName, info);
}
/**
* 后置通知
*
* @param logInfo
*/
@AfterReturning(pointcut = "pointCutWithMsg(logInfo)")
public void afterReturning(JoinPoint joinPoint, LogInfo logInfo) {
long end = System.currentTimeMillis();
long ms = end - startTime.get();
String info = logInfo.value();
String targetName = joinPoint.getTarget().getClass().getName();
String methodName = joinPoint.getSignature().getName();
logger.info("{} {} : {} completed in {} ms", targetName, methodName, info, ms);
}
/**
* 异常通知
*
* @param e
*/
// @AfterThrowing(pointcut = "pointCut()", throwing = "e")
public void afterThroing(Exception e) {
logger.error("异常信息:{}", e.getMessage());
}
/**
* 环绕通知=前置+后置
*
* @param pjp
* @param logInfo
* @return
*/
// @Around("pointCutWithMsg(logInfo)")
public Object around(ProceedingJoinPoint pjp, LogInfo logInfo) {
String info = logInfo.value();// 获取注解信息
Object result = null;// 被代理对象方法返回的结果
try {
logger.info("{} start", info);
result = pjp.proceed();
logger.info("{} end", info);
} catch (Throwable e) {
logger.error(e.getMessage());
}
return result;
}
/**
* 获取日志注解信息
*
* @param joinPoint
* @return
* @throws ClassNotFoundException
*/
@Deprecated
public String getMsg(JoinPoint joinPoint) throws ClassNotFoundException {
String targetName = joinPoint.getTarget().getClass().getName();// 类名
String methodName = joinPoint.getSignature().getName();// 方法名
Object[] arguments = joinPoint.getArgs();// 方法参数
Class targetClass = Class.forName(targetName);
Method[] methods = targetClass.getMethods();
String description = "";
for (Method method : methods) {
if (method.getName().equals(methodName)) {
Class[] clazzs = method.getParameterTypes();
if (clazzs.length == arguments.length) {
description = method.getAnnotation(LogInfo.class).value();
break;
}
}
}
return description;
}
}