亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

springboot 實(shí)現(xiàn)記錄業(yè)務(wù)日志和異常業(yè)務(wù)日志的操作

 更新時(shí)間:2021年07月27日 14:57:17   作者:^止境^  
這篇文章主要介紹了springboot 實(shí)現(xiàn)記錄業(yè)務(wù)日志和異常業(yè)務(wù)日志的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

日志記錄到redis展現(xiàn)形式

1.基于注解的方式實(shí)現(xiàn)日志記錄,掃描對(duì)應(yīng)的方法實(shí)現(xiàn)日志記錄

@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface BussinessLog {
 
    /**
     * 業(yè)務(wù)的名稱,例如:"修改菜單"
     */
    String value() default "";
 
    /**
     * 被修改的實(shí)體的唯一標(biāo)識(shí),例如:菜單實(shí)體的唯一標(biāo)識(shí)為"id"
     */
    String key() default "id";
 
    /**
     * 業(yè)務(wù)類型
     */
    String type() default "0";
 
    /**
     * 字典(用于查找key的中文名稱和字段的中文名稱)
     */
    Class<? extends AbstractDictMap> dict() default SystemDict.class; 
}

2.掃描的方法,基于注解實(shí)現(xiàn)方法掃描并且記錄日志

3.基于@Aspect注解,實(shí)現(xiàn)日志掃描,并且記錄日志

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component; 
import java.lang.reflect.Method;
import java.util.Map;
 
/**
 * 日志記錄
 *
 */
@Aspect
@Component
public class LogAop { 
    private Logger log = LoggerFactory.getLogger(this.getClass()); 
    @Pointcut(value = "@annotation(com.stylefeng.guns.core.common.annotion.BussinessLog)")
    public void cutService() {
    }
 
    @Around("cutService()")
    public Object recordSysLog(ProceedingJoinPoint point) throws Throwable {
 
        //先執(zhí)行業(yè)務(wù)
        Object result = point.proceed();
 
        try {
            handle(point);
        } catch (Exception e) {
            log.error("日志記錄出錯(cuò)!", e);
        } 
        return result;
    }
 
    private void handle(ProceedingJoinPoint point) throws Exception {
 
        //獲取攔截的方法名
        Signature sig = point.getSignature();
        MethodSignature msig = null;
        if (!(sig instanceof MethodSignature)) {
            throw new IllegalArgumentException("該注解只能用于方法");
        }
        msig = (MethodSignature) sig;
        Object target = point.getTarget();
        Method currentMethod = target.getClass().getMethod(msig.getName(), msig.getParameterTypes());
        String methodName = currentMethod.getName();
 
        //如果當(dāng)前用戶未登錄,不做日志
        ShiroUser user = ShiroKit.getUser();
        if (null == user) {
            return;
        }
 
        //獲取攔截方法的參數(shù)
        String className = point.getTarget().getClass().getName();
        Object[] params = point.getArgs();
 
        //獲取操作名稱
        BussinessLog annotation = currentMethod.getAnnotation(BussinessLog.class);
        String bussinessName = annotation.value();
        String key = annotation.key();
        Class dictClass = annotation.dict();
 
        StringBuilder sb = new StringBuilder();
        for (Object param : params) {
            sb.append(param);
            sb.append(" & ");
        }
 
        //如果涉及到修改,比對(duì)變化
        String msg;
        if (bussinessName.contains("修改") || bussinessName.contains("編輯")) {
            Object obj1 = LogObjectHolder.me().get();
            Map<String, String> obj2 = HttpContext.getRequestParameters();
            msg = Contrast.contrastObj(dictClass, key, obj1, obj2);
        } else {
            Map<String, String> parameters = HttpContext.getRequestParameters();
            AbstractDictMap dictMap = (AbstractDictMap) dictClass.newInstance();
            msg = Contrast.parseMutiKey(dictMap, key, parameters);
        }
        log.info("[記錄日志][RESULT:{}]",user.getId()+bussinessName+className+methodName+msg.toString());
        LogManager.me().executeLog(LogTaskFactory.bussinessLog(user.getId(), bussinessName, className, methodName, msg));
    }
}

4.比較兩個(gè)對(duì)象的工具類

import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Date;
import java.util.Map;
 
/**
 * 對(duì)比兩個(gè)對(duì)象的變化的工具類
 *
 * @author ...
 * @Date 2017/3/31 10:36
 */
public class Contrast {
 
    //記錄每個(gè)修改字段的分隔符
    public static final String separator = ";;;";
 
    /**
     * 比較兩個(gè)對(duì)象,并返回不一致的信息
     *
     * @author ...
     * @Date 2017/5/9 19:34
     */
    public static String contrastObj(Object pojo1, Object pojo2) {
        String str = "";
        try {
            Class clazz = pojo1.getClass();
            Field[] fields = pojo1.getClass().getDeclaredFields();
            int i = 1;
            for (Field field : fields) {
                if ("serialVersionUID".equals(field.getName())) {
                    continue;
                }
                PropertyDescriptor pd = new PropertyDescriptor(field.getName(), clazz);
                Method getMethod = pd.getReadMethod();
                Object o1 = getMethod.invoke(pojo1);
                Object o2 = getMethod.invoke(pojo2);
                if (o1 == null || o2 == null) {
                    continue;
                }
                if (o1 instanceof Date) {
                    o1 = DateUtil.getDay((Date) o1);
                }
                if (!o1.toString().equals(o2.toString())) {
                    if (i != 1) {
                        str += separator;
                    }
                    str += "字段名稱" + field.getName() + ",舊值:" + o1 + ",新值:" + o2;
                    i++;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return str;
    }
 
    /**
     * 比較兩個(gè)對(duì)象pojo1和pojo2,并輸出不一致信息
     *
     * @author ...
     * @Date 2017/5/9 19:34
     */
    public static String contrastObj(Class dictClass, String key, Object pojo1, Map<String, String> pojo2) throws IllegalAccessException, InstantiationException {
        AbstractDictMap dictMap = (AbstractDictMap) dictClass.newInstance();
        String str = parseMutiKey(dictMap, key, pojo2) + separator;
        try {
            Class clazz = pojo1.getClass();
            Field[] fields = pojo1.getClass().getDeclaredFields();
            int i = 1;
            for (Field field : fields) {
                if ("serialVersionUID".equals(field.getName())) {
                    continue;
                }
                PropertyDescriptor pd = new PropertyDescriptor(field.getName(), clazz);
                Method getMethod = pd.getReadMethod();
                Object o1 = getMethod.invoke(pojo1);
                Object o2 = pojo2.get(StrKit.firstCharToLowerCase(getMethod.getName().substring(3)));
                if (o1 == null || o2 == null) {
                    continue;
                }
                if (o1 instanceof Date) {
                    o1 = DateUtil.getDay((Date) o1);
                } else if (o1 instanceof Integer) {
                    o2 = Integer.parseInt(o2.toString());
                }
                if (!o1.toString().equals(o2.toString())) {
                    if (i != 1) {
                        str += separator;
                    }
                    String fieldName = dictMap.get(field.getName());
                    String fieldWarpperMethodName = dictMap.getFieldWarpperMethodName(field.getName());
                    if (fieldWarpperMethodName != null) {
                        Object o1Warpper = DictFieldWarpperFactory.createFieldWarpper(o1, fieldWarpperMethodName);
                        Object o2Warpper = DictFieldWarpperFactory.createFieldWarpper(o2, fieldWarpperMethodName);
                        str += "字段名稱:" + fieldName + ",舊值:" + o1Warpper + ",新值:" + o2Warpper;
                    } else {
                        str += "字段名稱:" + fieldName + ",舊值:" + o1 + ",新值:" + o2;
                    }
                    i++;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return str;
    }
 
    /**
     * 比較兩個(gè)對(duì)象pojo1和pojo2,并輸出不一致信息
     *
     * @author ...
     * @Date 2017/5/9 19:34
     */
    public static String contrastObjByName(Class dictClass, String key, Object pojo1, Map<String, String> pojo2) throws IllegalAccessException, InstantiationException {
        AbstractDictMap dictMap = (AbstractDictMap) dictClass.newInstance();
        String str = parseMutiKey(dictMap, key, pojo2) + separator;
        try {
            Class clazz = pojo1.getClass();
            Field[] fields = pojo1.getClass().getDeclaredFields();
            int i = 1;
            for (Field field : fields) {
                if ("serialVersionUID".equals(field.getName())) {
                    continue;
                }
                String prefix = "get";
                int prefixLength = 3;
                if (field.getType().getName().equals("java.lang.Boolean")) {
                    prefix = "is";
                    prefixLength = 2;
                }
                Method getMethod = null;
                try {
                    getMethod = clazz.getDeclaredMethod(prefix + StrKit.firstCharToUpperCase(field.getName()));
                } catch (NoSuchMethodException e) {
                    System.err.println("this className:" + clazz.getName() + " is not methodName: " + e.getMessage());
                    continue;
                }
                Object o1 = getMethod.invoke(pojo1);
                Object o2 = pojo2.get(StrKit.firstCharToLowerCase(getMethod.getName().substring(prefixLength)));
                if (o1 == null || o2 == null) {
                    continue;
                }
                if (o1 instanceof Date) {
                    o1 = DateUtil.getDay((Date) o1);
                } else if (o1 instanceof Integer) {
                    o2 = Integer.parseInt(o2.toString());
                }
                if (!o1.toString().equals(o2.toString())) {
                    if (i != 1) {
                        str += separator;
                    }
                    String fieldName = dictMap.get(field.getName());
                    String fieldWarpperMethodName = dictMap.getFieldWarpperMethodName(field.getName());
                    if (fieldWarpperMethodName != null) {
                        Object o1Warpper = DictFieldWarpperFactory.createFieldWarpper(o1, fieldWarpperMethodName);
                        Object o2Warpper = DictFieldWarpperFactory.createFieldWarpper(o2, fieldWarpperMethodName);
                        str += "字段名稱:" + fieldName + ",舊值:" + o1Warpper + ",新值:" + o2Warpper;
                    } else {
                        str += "字段名稱:" + fieldName + ",舊值:" + o1 + ",新值:" + o2;
                    }
                    i++;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return str;
    }
 
    /**
     * 解析多個(gè)key(逗號(hào)隔開的)
     *
     * @author ...
     * @Date 2017/5/16 22:19
     */
    public static String parseMutiKey(AbstractDictMap dictMap, String key, Map<String, String> requests) {
        StringBuilder sb = new StringBuilder();
        if (key.indexOf(",") != -1) {
            String[] keys = key.split(",");
            for (String item : keys) {
                String fieldWarpperMethodName = dictMap.getFieldWarpperMethodName(item);
                String value = requests.get(item);
                if (fieldWarpperMethodName != null) {
                    Object valueWarpper = DictFieldWarpperFactory.createFieldWarpper(value, fieldWarpperMethodName);
                    sb.append(dictMap.get(item) + "=" + valueWarpper + ",");
                } else {
                    sb.append(dictMap.get(item) + "=" + value + ",");
                }
            }
            return StrKit.removeSuffix(sb.toString(), ",");
        } else {
            String fieldWarpperMethodName = dictMap.getFieldWarpperMethodName(key);
            String value = requests.get(key);
            if (fieldWarpperMethodName != null) {
                Object valueWarpper = DictFieldWarpperFactory.createFieldWarpper(value, fieldWarpperMethodName);
                sb.append(dictMap.get(key) + "=" + valueWarpper);
            } else {
                sb.append(dictMap.get(key) + "=" + value);
            }
            return sb.toString();
        }
    } 
}

5.根據(jù)輸入方法獲取數(shù)據(jù)字典的數(shù)據(jù)

import java.lang.reflect.Method;  
public class DictFieldWarpperFactory {  
    public static Object createFieldWarpper(Object parameter, String methodName) {
        IConstantFactory constantFactory = ConstantFactory.me();
        try {
            Method method = IConstantFactory.class.getMethod(methodName, parameter.getClass());
            return method.invoke(constantFactory, parameter);
        } catch (Exception e) {
            try {
                Method method = IConstantFactory.class.getMethod(methodName, Integer.class);
                return method.invoke(constantFactory, Integer.parseInt(parameter.toString()));
            } catch (Exception e1) {
                throw new RuntimeException("BizExceptionEnum.ERROR_WRAPPER_FIELD");
            }
        }
    } 
}

6.對(duì)應(yīng)獲取數(shù)據(jù)字典的方法

public interface IConstantFactory { 
    /**
     * 獲取狀態(tài)
     */
    String getWordStatus(Integer DATA_STATUS); 
}
import com.qihoinfo.dev.log.util.SpringContextHolder;
import org.anyline.service.AnylineService;
import org.springframework.context.annotation.DependsOn;
import org.springframework.stereotype.Component;  
@Component
@DependsOn("springContextHolder")
public class ConstantFactory implements IConstantFactory { 
    private AnylineService anylineService = SpringContextHolder.getBean(AnylineService.class); 
    public static IConstantFactory me() {
        return SpringContextHolder.getBean("constantFactory");
    }
 
    @Override
    public String getWordStatus(Integer DATA_STATUS) {
        if ("1".equals(DATA_STATUS.toString())) {
            return "啟用";
        } else {
            return "停用";
        }
    } 
}

7.spring根據(jù)方法名獲取對(duì)應(yīng)容器中的對(duì)象

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component; 
/**
 * Spring的ApplicationContext的持有者,可以用靜態(tài)方法的方式獲取spring容器中的bean
 */
@Component
public class SpringContextHolder implements ApplicationContextAware {  
    private static ApplicationContext applicationContext; 
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        SpringContextHolder.applicationContext = applicationContext;
    }
 
    public static ApplicationContext getApplicationContext() {
        assertApplicationContext();
        return applicationContext;
    }
 
    @SuppressWarnings("unchecked")
    public static <T> T getBean(String beanName) {
        assertApplicationContext();
        return (T) applicationContext.getBean(beanName);
    }
 
    public static <T> T getBean(Class<T> requiredType) {
        assertApplicationContext();
        return applicationContext.getBean(requiredType);
    }
 
    private static void assertApplicationContext() {
        if (SpringContextHolder.applicationContext == null) {
            throw new RuntimeException("applicaitonContext屬性為null,請(qǐng)檢查是否注入了SpringContextHolder!");
        }
    } 
}

8.字符串工具類

/**
 * 字符串工具類
 */
public class StrKit {   
    /**
     * 首字母變小寫
     */
    public static String firstCharToLowerCase(String str) {
        char firstChar = str.charAt(0);
        if (firstChar >= 'A' && firstChar <= 'Z') {
            char[] arr = str.toCharArray();
            arr[0] += ('a' - 'A');
            return new String(arr);
        }
        return str;
    }
    /**
     * 首字母變大寫
     */
    public static String firstCharToUpperCase(String str) {
        char firstChar = str.charAt(0);
        if (firstChar >= 'a' && firstChar <= 'z') {
            char[] arr = str.toCharArray();
            arr[0] -= ('a' - 'A');
            return new String(arr);
        }
        return str;
    }
    /**
     * 去掉指定后綴
     */
    public static String removeSuffix(String str, String suffix) {
        if (isEmpty(str) || isEmpty(suffix)) {
            return str;
        }
        if (str.endsWith(suffix)) {
            return str.substring(0, str.length() - suffix.length());
        }
        return str;
    }
    /**
     * 字符串是否為空,空的定義如下 1、為null <br>
     * 2、為""<br>
     */
    public static boolean isEmpty(String str) {
        return str == null || str.length() == 0;
    }
}
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;  
public class ToolUtil {
    public static final int SALT_LENGTH = 6;
 
    public ToolUtil() {
    }
 
    public static String getExceptionMsg(Throwable e) {
        StringWriter sw = new StringWriter();
 
        try {
            e.printStackTrace(new PrintWriter(sw));
        } finally {
            try {
                sw.close();
            } catch (IOException var8) {
                var8.printStackTrace();
            }
 
        } 
        return sw.getBuffer().toString().replaceAll("\\$", "T");
    }
}

9.獲取數(shù)據(jù)字典的類

import java.util.HashMap;  
public abstract class AbstractDictMap { 
    protected HashMap<String, String> dictory = new HashMap<>();
    protected HashMap<String, String> fieldWarpperDictory = new HashMap<>(); 
    public AbstractDictMap() {
        put("ID", "主鍵ID");
        init();
        initBeWrapped();
    }
 
    public abstract void init(); 
    protected abstract void initBeWrapped(); 
    public String get(String key) {
        return this.dictory.get(key);
    }
 
    public void put(String key, String value) {
        this.dictory.put(key, value);
    }
 
    public String getFieldWarpperMethodName(String key) {
        return this.fieldWarpperDictory.get(key);
    }
 
    public void putFieldWrapperMethodName(String key, String methodName) {
        this.fieldWarpperDictory.put(key, methodName);
    }
}
public class SystemDict extends AbstractDictMap { 
    @Override
    public void init() {
    }
 
    @Override
    protected void initBeWrapped() {
 
    }
}
public class WordMap extends AbstractDictMap { 
    @Override
    public void init() {
        put("EN", "英文");
        put("CN", "中文");
        put("SHORT", "簡(jiǎn)稱");
        put("REMARK", "備注");
        put("DATA_STATUS", "狀態(tài)");
    }
 
    @Override
    protected void initBeWrapped() {
        putFieldWrapperMethodName("DATA_STATUS","getWordStatus");
    } 
}

10.獲取緩存對(duì)象的bean

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import org.springframework.web.context.WebApplicationContext; 
import java.io.Serializable;  
@Component
@Scope(scopeName = WebApplicationContext.SCOPE_SESSION)
public class LogObjectHolder implements Serializable{ 
    private Object object = null; 
    public void set(Object obj) {
        this.object = obj;
    }
 
    public Object get() {
        return object;
    }
 
    public static LogObjectHolder me(){
        LogObjectHolder bean = SpringContextHolder.getBean(LogObjectHolder.class);
        return bean;
    } 
}

11.運(yùn)行時(shí)異常的獲取

@ControllerAdvice
public class GlobalExceptionHandler extends BasicMemberJSONController { 
    private Logger log = LoggerFactory.getLogger(this.getClass()); 
    @ExceptionHandler(RuntimeException.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    @ResponseBody
    public String notFount(RuntimeException e) {
        String userName = curManage().get("USERNAME").toString();
        LogManager.me().executeLog(LogTaskFactory.exceptionLog(userName, e));
        log.error("運(yùn)行時(shí)異常:", e);
        return fail();
    }
}

12.使用線程池創(chuàng)建操作日志

import java.util.Date;  
public class LogFactory {  
    /**
     * 創(chuàng)建操作日志
     */
    public static DataRow createOperationLog(LogType logType, String userName, String bussinessName, String clazzName, String methodName, String msg, LogSucceed succeed) {
        DataRow operationLog = new DataRow();
        operationLog.put("log_type", logType.getMessage());
        operationLog.put("USER_NAME", userName);
        operationLog.put("log_name", bussinessName);
        operationLog.put("CLASS_NAME", clazzName);
        operationLog.put("METHOD", methodName);
        operationLog.put("CREATE_TIME", new Date());
        operationLog.put("SUCCEED", succeed.getMessage());
        if (msg.length() > 800) {
            msg = msg.substring(0, 800);
            operationLog.put("MESSAGE", msg);
        } else {
            operationLog.put("MESSAGE", msg);
        }
        return operationLog;
    }
}
import java.util.TimerTask;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit; 
 
public class LogManager { 
    //日志記錄操作延時(shí)
    private final int OPERATE_DELAY_TIME = 10;
 
    //異步操作記錄日志的線程池
    private ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(10); 
    private LogManager() {
    }
 
    public static LogManager logManager = new LogManager(); 
    public static LogManager me() {
        return logManager;
    }
 
    public void executeLog(TimerTask task) {
        executor.schedule(task, OPERATE_DELAY_TIME, TimeUnit.MILLISECONDS);
    } 
}
public enum LogSucceed { 
    SUCCESS("成功"),
    FAIL("失敗");
 
    String message; 
    LogSucceed(String message) {
        this.message = message;
    }
 
    public String getMessage() {
        return message;
    }
 
    public void setMessage(String message) {
        this.message = message;
    } 
}
import com.qihoinfo.dev.log.annotation.RedisDb;
import com.qihoinfo.dev.log.util.ToolUtil;
import org.anyline.entity.DataRow;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.DependsOn;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component; 
import java.util.TimerTask; 
 
@Component
@DependsOn("springContextHolder")
public class LogTaskFactory {
 
    private static Logger logger = LoggerFactory.getLogger(LogManager.class); 
    private static StringRedisTemplate redisTemplate = RedisDb.getMapper(StringRedisTemplate.class);
 
    public static TimerTask bussinessLog(final String userName, final String bussinessName, final String clazzName, final String methodName, final String msg) {
        return new TimerTask() {
            @Override
            public void run() {
                DataRow operationLog = LogFactory.createOperationLog(
                        LogType.BUSSINESS, userName, bussinessName, clazzName, methodName, msg, LogSucceed.SUCCESS);
                try {
 
                    redisTemplate.opsForList().rightPush("sys_operation_log", operationLog.getJson());
                } catch (Exception e) {
                    logger.error("創(chuàng)建業(yè)務(wù)日志異常!", e);
                }
            }
        };
    }
 
    public static TimerTask exceptionLog(final String userName, final Exception exception) {
        return new TimerTask() {
            @Override
            public void run() {
                String msg = ToolUtil.getExceptionMsg(exception);
                DataRow operationLog = LogFactory.createOperationLog(
                        LogType.EXCEPTION, userName, "", null, null, msg, LogSucceed.FAIL);
                try {
                    redisTemplate.opsForList().rightPush("sys_operation_log", operationLog.getJson());
                } catch (Exception e) {
                    logger.error("創(chuàng)建異常日志異常!", e);
                }
            }
        };
    } 
}
public enum LogType {
 
    EXCEPTION("異常日志"),
    BUSSINESS("業(yè)務(wù)日志");
 
    String message; 
    LogType(String message) {
        this.message = message;
    }
 
    public String getMessage() {
        return message;
    }
 
    public void setMessage(String message) {
        this.message = message;
    } 
}

13.將日志記錄到redis數(shù)據(jù)庫(kù)

package com.qihoinfo.dev.log.annotation;  
import com.qihoinfo.dev.log.util.SpringContextHolder;
import org.springframework.data.redis.core.StringRedisTemplate; 
public class RedisDb<T> {  
    private Class<T> clazz; 
    private StringRedisTemplate baseMapper; 
 
    private RedisDb(Class clazz) {
        this.clazz = clazz;
        this.baseMapper = (StringRedisTemplate) SpringContextHolder.getBean(clazz);
    } 
 
    public static <T> RedisDb<T> create(Class<T> clazz) {
        return new RedisDb<T>(clazz);
    } 
 
    public StringRedisTemplate getMapper() {
        return this.baseMapper;
    } 
 
    public static <T> T getMapper(Class<T> clazz) {
        return SpringContextHolder.getBean(clazz);
    }  
}
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes; 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
 
/**
 * @Description:
 * @Auther: wj
 * @Date: 2019/5/28 13:56
 */
public class HttpContext {
    public HttpContext() {
    }
 
    public static String getIp() {
        HttpServletRequest request = getRequest();
        return request == null ? "127.0.0.1" : request.getRemoteHost();
    }
 
    public static HttpServletRequest getRequest() {
        ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        return requestAttributes == null ? null : requestAttributes.getRequest();
    }
 
    public static HttpServletResponse getResponse() {
        ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        return requestAttributes == null ? null : requestAttributes.getResponse();
    }
 
    public static Map<String, String> getRequestParameters() {
        HashMap<String, String> values = new HashMap();
        HttpServletRequest request = getRequest();
        if (request == null) {
            return values;
        } else {
            Enumeration enums = request.getParameterNames();
 
            while (enums.hasMoreElements()) {
                String paramName = (String) enums.nextElement();
                String paramValue = request.getParameter(paramName);
                values.put(paramName, paramValue);
            }
 
            return values;
        }
    }
}

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解Spring Boot配置文件之多環(huán)境配置

    詳解Spring Boot配置文件之多環(huán)境配置

    本篇文章主要介紹了詳解Spring Boot配置文件之多環(huán)境配置 ,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-09-09
  • 使用多個(gè)servlet時(shí)Spring security需要指明路由匹配策略問題

    使用多個(gè)servlet時(shí)Spring security需要指明路由匹配策略問題

    這篇文章主要介紹了使用多個(gè)servlet時(shí)Spring security需要指明路由匹配策略問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • 教你怎么用Java回溯算法解數(shù)獨(dú)

    教你怎么用Java回溯算法解數(shù)獨(dú)

    一直不太會(huì)數(shù)獨(dú)問題,這次下決定搞明白,所以整理了本篇文章,文中有非常詳細(xì)的代碼示例,對(duì)不會(huì)算法的小伙伴們很有幫助,需要的朋友可以參考下
    2021-06-06
  • 詳解批處理框架之Spring Batch

    詳解批處理框架之Spring Batch

    Spring Batch是一個(gè)輕量級(jí)的、完善的批處理框架,作為Spring體系中的一員,它擁有靈活、方便、生產(chǎn)可用的特點(diǎn)。在應(yīng)對(duì)高效處理大量信息、定時(shí)處理大量數(shù)據(jù)等場(chǎng)景十分簡(jiǎn)便。結(jié)合調(diào)度框架能更大地發(fā)揮Spring Batch的作用
    2021-06-06
  • Java中Lambda表達(dá)式的使用詳解

    Java中Lambda表達(dá)式的使用詳解

    Lambda 表達(dá)式,也可稱為閉包,它是推動(dòng) Java 8 發(fā)布的最重要新特性。Lambda 允許把函數(shù)作為一個(gè)方法的參數(shù)(函數(shù)作為參數(shù)傳遞進(jìn)方法中)。使用 Lambda 表達(dá)式可以使代碼變的更加簡(jiǎn)潔緊湊
    2021-09-09
  • Java selenium處理極驗(yàn)滑動(dòng)驗(yàn)證碼示例

    Java selenium處理極驗(yàn)滑動(dòng)驗(yàn)證碼示例

    本篇文章主要介紹了Java selenium處理極驗(yàn)滑動(dòng)驗(yàn)證碼示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-10-10
  • 圖文詳解java反射機(jī)制及常用應(yīng)用場(chǎng)景

    圖文詳解java反射機(jī)制及常用應(yīng)用場(chǎng)景

    這篇文章主要為大家介紹了圖文詳解java反射機(jī)制及常用應(yīng)用場(chǎng)景,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-03-03
  • java自定義動(dòng)態(tài)鏈接數(shù)據(jù)庫(kù)示例

    java自定義動(dòng)態(tài)鏈接數(shù)據(jù)庫(kù)示例

    這篇文章主要介紹了java自定義動(dòng)態(tài)鏈接數(shù)據(jù)庫(kù)示例,需要的朋友可以參考下
    2014-02-02
  • 集群環(huán)境中使用ehcache_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    集群環(huán)境中使用ehcache_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要為大家詳細(xì)介紹了集群環(huán)境中使用ehcache的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • Java設(shè)置千分位分隔符的兩種方法

    Java設(shè)置千分位分隔符的兩種方法

    在 Java 中,有時(shí)候我們需要對(duì)數(shù)字進(jìn)行千分位分隔,以提升數(shù)字的可讀性,本文將介紹如何在 Java 中實(shí)現(xiàn)對(duì)數(shù)字設(shè)置千分位分隔符的方法,需要的朋友可以參考下
    2024-10-10

最新評(píng)論