Servlet工具类

Servlet工具类

别null了 2,661 2022-08-24
package com.marquis.chen.server.utils;

import cn.hutool.core.convert.Convert;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.springframework.web.context.request.RequestAttributes;
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 javax.servlet.http.HttpSession;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;

/**
 * 客户端工具类
 *
 * @author marquis.chen
 */
@Slf4j
public class ServletUtils {

    /**
     * 获取Request参数,返回String类型
     *
     * @param name 参数名
     */
    public static String getParameter(String name) {
        return getRequest().getParameter(name);
    }

    /**
     * 获取Request参数,返回指定类型
     *
     * @param name  参数名
     * @param clazz 参数类型
     */
    public static <T> T getParameter(String name, Class<T> clazz) {
        return Convert.convert(clazz, getRequest().getParameter(name));
    }

    /**
     * 获取Request参数,如果为空或转换失败返回默认值
     *
     * @param name         参数名
     * @param defaultValue 默认值
     */
    public static <T> T getParameter(String name, T defaultValue) {
        return Convert.convert(defaultValue.getClass(), getRequest().getParameter(name), defaultValue);
    }

    /**
     * 获取所有query参数,返回Map
     *
     * @return {@link Map}
     */
    public static Map<String, String> getParameters() {
        return getParameters(null);
    }

    /**
     * 获取所有query参数,返回Map
     *
     * @param request ServletRequest
     * @return {@link Map}
     */
    public static Map<String, String> getParameters(HttpServletRequest request) {
        if (request == null) {
            request = getRequest();
        }
        Enumeration<String> parameterNames = request.getParameterNames();
        HashMap<String, String> map = new HashMap<>(16);
        while (parameterNames.hasMoreElements()) {
            String key = parameterNames.nextElement();
            map.put(key, request.getParameter(key));
        }
        return map;
    }

    /**
     * 获取body参数
     */
    public static String getBody(HttpServletRequest request) {
        if (request == null) {
            request = getRequest();
        }
        StringBuilder data = new StringBuilder();
        BufferedReader reader = null;
        try (InputStream inputStream = request.getInputStream()) {
            reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
            String line = "";
            while ((line = reader.readLine()) != null) {
                data.append(line);
            }
        } catch (IOException e) {
            log.warn("获取body数据出错!");
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e) {
                    log.error(ExceptionUtils.getMessage(e));
                }
            }
        }
        return data.toString();
    }

    /**
     * 获取body参数
     */
    public static String getBody() {
        return getBody(null);
    }

    /**
     * 获取request
     */
    public static HttpServletRequest getRequest() {
        return getRequestAttributes().getRequest();
    }

    /**
     * 获取response
     */
    public static HttpServletResponse getResponse() {
        return getRequestAttributes().getResponse();
    }

    /**
     * 获取session
     */
    public static HttpSession getSession() {
        return getRequest().getSession();
    }

    public static ServletRequestAttributes getRequestAttributes() {
        RequestAttributes attributes = RequestContextHolder.getRequestAttributes();
        return (ServletRequestAttributes) attributes;
    }

    /**
     * 将字符串渲染到客户端
     *
     * @param response 渲染对象
     * @param string   待渲染的字符串
     * @return null
     */
    public static void renderString(HttpServletResponse response, String string) {
        renderString(response, string, "application/json");
    }

    /**
     * 将字符串渲染到客户端
     *
     * @param response    渲染对象
     * @param string      待渲染的字符串
     * @param contentType 响应内容类型
     */
    public static void renderString(HttpServletResponse response, String string, String contentType) {
        try {
            response.setStatus(200);
            response.setContentType(contentType);
            response.setCharacterEncoding(StandardCharsets.UTF_8.displayName());
            response.getWriter().print(string);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 是否是Ajax异步请求
     *
     * @param request
     */
    public static boolean isAjaxRequest(HttpServletRequest request) {
        String accept = request.getHeader("accept");
        if (accept != null && accept.contains("application/json")) {
            return true;
        }

        String xRequestedWith = request.getHeader("X-Requested-With");
        if (xRequestedWith != null && xRequestedWith.contains("XMLHttpRequest")) {
            return true;
        }

        String uri = request.getRequestURI();
        if (StringUtils.equalsAnyIgnoreCase(uri, ".json", ".xml")) {
            return true;
        }

        String ajax = request.getParameter("__ajax");
        if (StringUtils.equalsAnyIgnoreCase(ajax, "json", "xml")) {
            return true;
        }
        return false;
    }

    /**
     * 获取完整的请求路径,包括:域名,端口,上下文访问路径
     *
     * @return 服务地址
     */
    public static String getServerUrl() {
        HttpServletRequest request = getRequest();
        StringBuffer url = request.getRequestURL();
        String contextPath = request.getServletContext().getContextPath();
        // Nginx代理需要配置 proxy_set_header X-Forwarded-Scheme $scheme;
        String scheme = request.getHeader("X-Forwarded-Scheme");
        String domain = url.delete(url.length() - request.getRequestURI().length(), url.length()).append(contextPath).toString();
        if (StringUtils.isNotBlank(scheme)) {
            domain =  domain.replaceFirst("https?", scheme);
        }
        return domain;
    }
}


# Java