ExceptionHandler.java 2.76 KB
package com.cjs.site.action.interceptor;

import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;

import com.cjs.site.biz.ServiceException;
import com.cjs.site.util.lang.DateUtil;
import com.cjs.site.util.web.ActionUtil;

/**
 * Web通用异常处理
 * 
 * @author tongyufu
 *
 */
@Component
public class ExceptionHandler implements HandlerExceptionResolver {

    Logger log = LogManager.getLogger();

    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response,
                                         Object handler, Exception e) {
        Map<String, Object> model = new HashMap<String, Object>();
        if (e instanceof ServiceException) {
            model.put("errorMessage", e.getMessage());
        } else {
            model.put("errorMessage", "服务器异常,请联系客服:400-969-0800");
        }
        if (e instanceof ServiceException) {
            log.error(getErrorMessage(new RuntimeException(e), request));
        } else if (e instanceof RuntimeException) {
            //注意:只在开发时打印异常堆栈信息
            log.error(getErrorMessage(new RuntimeException(e), request), e);
        } else {
            log.error("", e);
        }
        model.put("e", e);
        return new ModelAndView("common/500.jsp", model);
    }

    /**获取发生错误时的请求信息*/
    private String getErrorMessage(RuntimeException ex, HttpServletRequest request) {
        StringBuilder sb = new StringBuilder();
        Map<String, String[]> params = request.getParameterMap();
        HttpServletRequest httpServletRequest = ActionUtil.getRequest();

        sb.append("\n异常时间:" + DateUtil.getNow());
        sb.append("\n请求参数:{");
        for (String param : params.keySet()) {
            sb.append("\n\t").append(param).append(":").append(request.getParameter(param));
        }
        sb.append("\n}");
        sb.append("\nIP:" + ActionUtil.getIP());
        sb.append("\nURL:");
        if (httpServletRequest != null) {
            sb.append(httpServletRequest.getMethod() + " ");
        }
        sb.append("\n头信息:{");
        for (Enumeration<String> e = request.getHeaderNames(); e.hasMoreElements();) {
            String header = e.nextElement();
            sb.append("\n\t").append(header).append(":").append(request.getHeader(header));
        }
        sb.append("\n}");
        return sb.toString();
    }

}