Spring上下文工具类

文章目录

获取ip地址

java 复制代码
public class IpUtils {

    private IpUtils() {
    }

    /**
     * 获取请求ip地址
     *
     * @return {@link String}
     */
    public static String getIpAddress() {
        HttpServletRequest request = RequestContextHolderUtils.getRequest();
        String ip = request.getHeader("x-forwarded-for");
        if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("Proxy-Client-IP");
        }

        if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("X-Forwarded-For");
        }

        if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("WL-Proxy-Client-IP");
        }

        if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("X-Real-IP");
        }

        if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
        }

        if ("0:0:0:0:0:0:0:1".equals(ip)) {
            ip = "127.0.0.1";
        }

        if (ip.contains(",")) {
            ip = ip.split(",")[0];
        }
        return ip;
    }
}

请求上下文相关

  • 获取HttpServletRequest、HttpServletResponse、HttpSession、ServletContext等对象
java 复制代码
public class RequestContextHolderUtils {
    
    /**
     * 获取HttpServletRequest请求对象
     *
     * @return {@link HttpServletRequest}
     */
    public static HttpServletRequest getRequest() {
        return getRequestAttributes().getRequest();
    }

    /**
     * 获取HttpServletResponse响应对象
     *
     * @return {@link HttpServletResponse}
     */
    public static HttpServletResponse getResponse() {
        return getRequestAttributes().getResponse();
    }

    /**
     * 获得会话
     *
     * @return {@link HttpSession}
     */
    public static HttpSession getSession() {
        return getRequest().getSession();
    }
     /**
     * 设置会话属性
     *
     * @param name  名字
     * @param value 值
     */
    public static void setSessionAttribute(String name, Object value) {
        getSession().setAttribute(name, value);
    }

    /**
     * 获得会话属性
     *
     * @param name 名字
     * @return {@link Object}
     */
    public static Object getSessionAttribute(String name) {
        return getSession().getAttribute(name);
    }

    /**
     * servlet容器请求属性
     *
     * @return {@link ServletRequestAttributes}
     */
    public static ServletRequestAttributes getRequestAttributes() {
        return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes());
    }

    /**
     * 得到servlet上下文
     *
     * @return {@link ServletContext}
     */
    public static ServletContext getServletContext() {
        return Objects.requireNonNull(ContextLoader.getCurrentWebApplicationContext()).getServletContext();
    }
}

Spring上下文获取Bean对象

java 复制代码
@Component
public class SpringContextUtils implements ApplicationContextAware {

    /**
     * 上下文对象实例
     * -- GETTER --
     *  获取applicationContext
     */
    @Getter
    private static ApplicationContext applicationContext;

    @Override
    @Autowired
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        SpringContextUtils.applicationContext = applicationContext;
    }

    /**
     * 通过name获取 Bean.
     */
    public static Object getBean(String name) {
        return getApplicationContext().getBean(name);
    }

    /**
     * 通过class获取Bean.
     */
    public static <T> T getBean(Class<T> clazz) {
        return getApplicationContext().getBean(clazz);
    }

    /**
     * 通过name,以及Clazz返回指定的Bean
     */
    public static <T> T getBean(String name, Class<T> clazz) {
        return getApplicationContext().getBean(name, clazz);
    }
}
相关推荐
长大19883 小时前
Node.js 22+ 特性实战:用内置能力写微服务与 CLI,能少装一堆依赖
后端
苍何3 小时前
飞书,成了豆包工作的“超级上下文”
后端
苍何3 小时前
会用 AI 做图,已经不够了(分享 3 个牛逼设计 skill)
后端
明月_清风3 小时前
发现一个超系统的 AI Agent 学习地图 —— Agent Atlas 推荐
人工智能·后端·agent
大勇前进4 小时前
设计模式在 JS 中的应用:用 TS 重写经典模式,结合 React / Vue 真实业务场景
后端
MacroZheng4 小时前
同事问我:"Claude Code经常失忆,不怕它把项目搞炸?",我:"怕,三个Markdown文件给它装个永不丢失的外置大脑!"
java·人工智能·后端
用户29975997127074 小时前
深分页的四种解法,以及为什么说它多半是个伪需求
后端
苏三说技术5 小时前
为什么越来越多人用 OpenSearch?
后端
大白805 小时前
JS 内存泄漏排查:用真实案例教你如何用 Chrome DevTools 定位并解决,顺带搞懂闭包和 GC
后端
泡海椒5 小时前
Lambda 极简调用:不定义接口直接执行 curl 命令,JQuick-Curl 让 Java HTTP 调用更短更快
后端