All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.moon.web.RequestUtil Maven / Gradle / Ivy

package com.moon.web;

import com.moon.core.lang.JoinerUtil;
import com.moon.core.lang.StringUtil;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;

import static com.moon.core.lang.StringUtil.isEmpty;
import static com.moon.core.lang.StringUtil.nullIfEmpty;
import static com.moon.core.lang.ThrowUtil.noInstanceError;

/**
 * @author moonsky
 */
public final class RequestUtil extends MimeUtil {

    private RequestUtil() { noInstanceError(); }

    /**
     * 获取所有请求头
     *
     * @param request request
     * @param keys    需要获取的请求头名称
     *
     * @return 请求头名称: 请求头值
     */
    public static Map headersMap(HttpServletRequest request, String... keys) {
        Map headers = new HashMap<>(16);
        if (keys == null || keys.length < 1) {
            Enumeration enums = request.getHeaderNames();
            while (enums.hasMoreElements()) {
                String key = enums.nextElement();
                headers.put(key, header(request, key));
            }
        } else {
            for (String key : keys) {
                headers.put(key, header(request, key));
            }
        }
        return headers;
    }

    /**
     * 获取指定请求头
     *
     * @param request request
     * @param name    请求头名字
     *
     * @return 请求头值
     */
    public static String header(HttpServletRequest request, String name) { return request.getHeader(name); }

    /**
     * 获取请求参数
     *
     * @param request request
     * @param name    参数名
     *
     * @return 参数值
     */
    public static String param(HttpServletRequest request, String name) { return request.getParameter(name); }

    /**
     * 获取请求参数,有些请求中可能将参数放在 header 中,这里可通过设置 header 优先获取
     * 如果不存在于 header 中,就从请求参数中获取
     *
     * @param request        request
     * @param name           参数名
     * @param headerPriority 是否优先从 header 中获取参数值
     *
     * @return 参数值
     */
    public static String param(
        HttpServletRequest request, String name, boolean headerPriority
    ) {
        String tokenVal = headerPriority ? header(request, name) : null;
        return isEmpty(tokenVal) ? param(request, name) : nullIfEmpty(tokenVal);
    }

    /**
     * 获取 request 属性
     *
     * @param request request
     * @param key     属性名
     * @param      为了兼容返回接收类型
     *
     * @return 返回属性值 或 null
     */
    public static  T attr(HttpServletRequest request, String key) { return (T) request.getAttribute(key); }

    /**
     * 设置 Request 属性
     *
     * @param request request 对象
     * @param key     属性名
     * @param value   属性值
     */
    public static void attr(HttpServletRequest request, String key, Object value) { request.setAttribute(key, value); }

    /**
     * 转发
     *
     * @param request
     * @param response
     * @param path
     *
     * @throws ServletException
     * @throws IOException
     */
    public static void forward(HttpServletRequest request, HttpServletResponse response, String path)
        throws ServletException, IOException {
        request.getRequestDispatcher(path).forward(request, response);
    }

    private static boolean isUnknown(String str) { return StringUtil.isEmpty(str) || "unknown".equalsIgnoreCase(str); }

    /**
     * 获取远程真实请求 IP
     *
     * @param request request
     *
     * @return ip
     */
    @SuppressWarnings("all")
    public static String getRequestRealIP(HttpServletRequest request) {
        String ip = null, comma = ",";
        try {
            ip = header(request, "x-forwarded-for");

            if (!isUnknown(ip)) {
                if (ip.indexOf(comma) != -1) {
                    ip = ip.split(comma)[0];
                }
            }
            if (isUnknown(ip)) { ip = header(request, "Proxy-Client-IP"); }
            if (isUnknown(ip)) { ip = header(request, "WL-Proxy-Client-IP"); }
            if (isUnknown(ip)) { ip = header(request, "HTTP_CLIENT_IP"); }
            if (isUnknown(ip)) { ip = header(request, "HTTP_X_FORWARDED_FOR"); }
            if (isUnknown(ip)) { ip = header(request, "X-Real-IP"); }
            if (isUnknown(ip)) { ip = request.getRemoteAddr(); }
        } catch (Exception e) {
            // ignore
        }
        return ip;
    }

    static String getRequestDomain(HttpServletRequest request) {
        int port = request.getServerPort(), dftPort = 80;
        String protocol = request.getProtocol();
        String host = getRequestRealIP(request);
        if (port == dftPort) {
            return JoinerUtil.join(new String[]{protocol, "://", host}, "");
        } else {
            String[] s = {protocol, "://", host, ":", String.valueOf(port)};
            return JoinerUtil.join(s, "");
        }
    }

    static String getRequestURL(HttpServletRequest request) {
        return StringUtil.concat(getRequestDomain(request), request.getContextPath(), request.getServletPath());
    }

    static String getRequestFullURL(HttpServletRequest request) {
        String url = getRequestURL(request), query = request.getQueryString();
        return isEmpty(query) ? url : StringUtil.concat(url, "?", query);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy