xingjinshuang
2025-02-20 0890b7861feae74bdcfd1851e577db6b9f31d484
src/main/java/com/se/simu/helper/WebHelper.java
@@ -1,57 +1,51 @@
package com.se.simu.helper;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.ServletContext;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.*;
import java.net.InetAddress;
import java.net.URLEncoder;
import java.net.UnknownHostException;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.*;
/**
 * Web帮助类
 *
 * @author WWW
 * @date 2024-07-16
 */
@Slf4j
@SuppressWarnings("ALL")
public class WebHelper {
    public final static String POINT = ".";
    private final static String COMMA = ",";
    private final static String UNKNOWN = "unknown";
    public final static String TOKEN_KEY = "token";
    public static boolean isWin() {
        String osName = System.getProperty("os.name");
    public final static String TOKEN_COOKIE_KEY = "token";
        return osName.startsWith("Windows");
    }
    public final static int COOKIE_MAX_AGE = 4 * 60 * 60;
    public static int getCpuCores() {
        return Runtime.getRuntime().availableProcessors();
    }
    /**
     * 获取GUID
     */
    public final static SimpleDateFormat YMDHMS = new SimpleDateFormat("yyyyMMddHHmmss");
    public static boolean isEmpty(String str) {
        return null == str || "".equals(str.trim());
    }
    public static String getGuid() {
        return UUID.randomUUID().toString();
    }
    /**
     * 获取主机IP
     *
     * @return
     */
    public static String getHostIp() {
        try {
            return InetAddress.getLocalHost().getHostAddress();
@@ -61,9 +55,6 @@
        return "127.0.0.1";
    }
    /**
     * 获取用户IP
     */
    public static String getIpAddress(HttpServletRequest request) {
        String ip = request.getHeader("X-Forwarded-For");
        if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) {
@@ -106,176 +97,28 @@
        return ip;
    }
    /**
     * 获取当前时间的Timestamp
     */
    public static Timestamp getCurrentTimestamp() {
        return new Timestamp(System.currentTimeMillis());
    }
    /**
     * 获取当前时间指定分钟数后的Timestamp
     */
    public static Timestamp getTimestamp(int min) {
        Calendar now = Calendar.getInstance();
        now.add(Calendar.MINUTE, min);
        return new Timestamp(now.getTimeInMillis());
    }
    /**
     * 从Cookie中获取token
     */
    public static String getTokenFromCookie(HttpServletRequest request) {
        Cookie[] cookies = request.getCookies();
        if (cookies == null || cookies.length == 0) {
            return null;
        }
        for (Cookie cookie : cookies) {
            switch (cookie.getName()) {
                case TOKEN_COOKIE_KEY:
                    return cookie.getValue();
                default:
                    break;
            }
        }
        return null;
    }
    /**
     * 向Cookie中添加token
     */
    public static void saveToken2Cookie(String token, HttpServletRequest request, HttpServletResponse response) {
        // 先删除
        deleteCookies(request, response);
        // 再保存
        saveCookie(TOKEN_COOKIE_KEY, token, response);
    }
    /**
     * 保存Cookie
     */
    public static void saveCookie(String key, String value, HttpServletResponse response) {
        Cookie cookie = new Cookie(key, value);
        // 设置cookie失效时间,单位为秒
        cookie.setMaxAge(COOKIE_MAX_AGE);
        cookie.setHttpOnly(false);
        cookie.setPath("/");
        //cookie.setDomain("*")
        response.setHeader("P3P", "CP=CAO PSA OUR");
        response.addCookie(cookie);
    }
    /**
     * 删除cookie中的值
     */
    public static void deleteCookie(String cookieKey, HttpServletRequest request, HttpServletResponse response) {
        Cookie[] cookies = request.getCookies();
        if (cookies != null && cookies.length > 0) {
            for (Cookie c : cookies) {
                if (cookieKey.equalsIgnoreCase(c.getName())) {
                    c.setMaxAge(0);
                    c.setPath("/");
                    response.addCookie(c);
                }
            }
        }
    }
    /**
     * 删除所有Cookie
     */
    public static void deleteCookies(HttpServletRequest request, HttpServletResponse response) {
        Cookie[] cookies = request.getCookies();
        if (cookies != null && cookies.length > 0) {
            for (Cookie c : cookies) {
                c.setMaxAge(0);
                c.setPath("/");
                response.addCookie(c);
            }
        }
    }
    /**
     * 根据键获取Cookie值
     */
    public static String getCookieByKey(String key, HttpServletRequest request) {
        Cookie[] cookies = request.getCookies();
        if (cookies == null || cookies.length == 0) {
            return null;
        }
        for (Cookie c : cookies) {
            if (key.equals(c.getName())) {
                return c.getValue();
            }
        }
        return null;
    }
    /**
     * 获取Token
     */
    public static String getToken(HttpServletRequest request) {
        // 1.从url参数中,获取token
        String token = request.getParameter(TOKEN_KEY);
        // 2.为空,则从header里获取
        if (token == null) {
            token = request.getHeader(TOKEN_KEY);
        }
        // 3.还为空,则从cookie里获取
        if (token == null) {
            token = getTokenFromCookie(request);
        }
        return token;
    }
    /**
     * 获取Request
     */
    public static HttpServletRequest getRequest() {
        ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        return servletRequestAttributes.getRequest();
    }
    /**
     * 获取Response
     */
    public static HttpServletResponse getResponse() {
        ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        return servletRequestAttributes.getResponse();
    }
    /**
     * 获取Session
     */
    public static HttpSession getSession() {
        return getRequest().getSession();
    public static boolean writeJson2Page(HttpServletResponse res, HttpStatus status, Object obj) {
        res.setStatus(status.value());
        return writeStr2Page(res, JSON.toJSONString(obj));
    }
    /**
     * 获取真实路径
     */
    public static String getRealPath(String path) {
        HttpServletRequest req = getRequest();
        ServletContext ctx = req.getSession().getServletContext();
        return ctx.getRealPath("/" + path);
    }
    /**
     * 输出JSON至页面
     */
    public static boolean writeJson2Page(HttpServletResponse res, HttpStatus status, String str) {
        res.setStatus(status.value());
@@ -286,18 +129,12 @@
        return writeStr2Page(res, JSON.toJSONString(map));
    }
    /**
     * 输出str至页面
     */
    public static boolean writeStr2Page(HttpServletResponse res, HttpStatus status, String str) {
        res.setStatus(status.value());
        return writeStr2Page(res, str);
    }
    /**
     * 输出str至页面
     */
    public static boolean writeStr2Page(HttpServletResponse res, String str) {
        try {
            res.setContentType("application/json;charset=UTF-8");
@@ -317,133 +154,163 @@
        return false;
    }
    /**
     * 获取随机整数
     */
    public static void writeBytes(byte[] bytes, HttpServletResponse res) throws IOException {
        res.setContentType("application/octet-stream");
        if (null == bytes) {
            res.setStatus(HttpStatus.NOT_FOUND.value());
            return;
        }
        OutputStream os = res.getOutputStream();
        os.write(bytes, 0, bytes.length);
        os.close();
    }
    public static void writePng(String filePath, HttpServletResponse res) throws IOException {
        File file = new File(filePath);
        if (!file.exists() || file.isDirectory()) {
            res.setStatus(HttpStatus.NOT_FOUND.value());
            return;
        }
        String fileName = URLEncoder.encode(filePath, "UTF-8").replace("+", "%20");
        res.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + fileName);
        res.setCharacterEncoding("UTF-8");
        res.setContentType("image/png");
        writeFile(filePath, res);
    }
    public static int getRandomInt(int min, int max) {
        return new Random().nextInt(max) % (max - min + 1) + min;
    }
    /**
     * 下载文件
     */
    public static void download(String file, String fileName, HttpServletResponse res) throws Exception {
        download(file, fileName, false, res);
    }
    /**
     * 下载文件
     *
     * @param file     文件
     * @param fileName 文件名
     * @param res      响应
     * @throws Exception 异常
     */
    public static void download(String file, String fileName, boolean inline, HttpServletResponse res) throws Exception {
        if (StringHelper.isEmpty(fileName)) {
            fileName = StringHelper.YMDHMS2_FORMAT.format(new Date());
        if (isEmpty(fileName)) {
            fileName = YMDHMS.format(new Date());
        }
        fileName = URLEncoder.encode(fileName, "UTF-8").replace("+", "%20");
        String dispose = inline ? "inline" : "attachment";
        // 设置响应头中文件的下载方式为附件方式,以及设置文件名
        res.setHeader("Content-Disposition", dispose + "; filename*=UTF-8''" + fileName);
        // 设置响应头的编码格式为 UTF-8
        res.setCharacterEncoding("UTF-8");
        // 通过response对象设置响应数据格式(如:"text/plain; charset=utf-8")
        String ext = FileHelper.getExtension(file);
        String mime = FileHelper.getMime(ext);
        String ext = getExtension(file);
        String mime = getMime(ext);
        res.setContentType(mime);
        // 通过response对象,获取到输出流
        writeFile(file, res);
    }
    private static void writeFile(String file, HttpServletResponse res) throws IOException {
        ServletOutputStream outputStream = res.getOutputStream();
        // 定义输入流,通过输入流读取文件内容
        FileInputStream fileInputStream = new FileInputStream(file);
        int len = 0;
        byte[] bytes = new byte[1024];
        while ((len = fileInputStream.read(bytes)) != -1) {
            // 通过输入流读取文件数据,然后通过上述的输出流写回浏览器
            outputStream.write(bytes, 0, len);
            outputStream.flush();
        }
        // 关闭资源
        fileInputStream.close();
        outputStream.close();
    }
    /**
     * 执行命令
     *
     * @param cmd 命令
     */
    public static void exec(String cmd) {
        try {
            Runtime.getRuntime().exec(cmd);
        } catch (Exception ex) {
            log.error(ex.getMessage(), ex);
    public static String getExtension(String fileName) {
        if (isEmpty(fileName)) {
            return "";
        }
        int idx = fileName.lastIndexOf(POINT);
        if (idx == -1) {
            return "";
        }
        return fileName.substring(idx).toLowerCase();
    }
    /**
     * 执行命令
     *
     * @param cmd 命令
     */
    public static String exec2(String cmd) {
        try {
            StringBuilder sb = new StringBuilder();
            Process process = Runtime.getRuntime().exec(cmd);
            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            String line;
            while ((line = reader.readLine()) != null) {
                sb.append(line).append("\n");
            }
            reader.close();
            return sb.toString();
        } catch (Exception ex) {
            log.error(ex.getMessage(), ex);
            return null;
    public static String getMime(String ext) {
        switch (ext) {
            case ".tif":
            case ".tiff":
                return "image/tiff";
            case ".img":
                return "application/x-img";
            case ".gif":
                return "image/gif";
            case ".jpg":
            case ".jpeg":
                return "image/jpeg";
            case ".png":
                return "image/png";
            case ".mp3":
                return "audio/mp3";
            case ".mp4":
                return "video/mpeg4";
            case ".avi":
                return "video/avi";
            case ".mpg":
            case ".mpeg":
                return "video/mpg";
            case ".wav":
                return "audio/wav";
            case ".wma":
                return "audio/x-ms-wma";
            case ".swf":
                return "application/x-shockwave-flash";
            case ".wmv":
                return "video/x-ms-wmv";
            case ".rm":
                return "application/vnd.rn-realmedia";
            case ".rmvb":
                return "application/vnd.rn-realmedia-vbr";
            case ".js":
                return "application/x-javascript";
            case ".css":
                return "text/css";
            case ".asp":
                return "text/asp";
            case ".mht":
                return "message/rfc822";
            case ".jsp":
            case ".htm":
            case ".html":
            case ".xhtml":
                return "text/html";
            case ".xml":
            case ".svg":
                return "text/xml";
            case ".txt":
                return "text/plain";
            case ".dbf":
                return "application/x-dbf";
            case ".mdb":
                return "application/msaccess";
            case ".pdf":
                return "application/pdf";
            case ".ppt":
            case ".pptx":
                return "application/x-ppt";
            case ".doc":
            case ".docx":
                return "application/msword";
            case ".xls":
            case ".xlsx":
                return "application/vnd.ms-excel";
            case ".dgn":
                return "application/x-dgn";
            case ".dwg":
                return "application/x-dwg";
            case ".ext":
                return "application/x-msdownload";
            default:
                return "application/octet-stream";
        }
    }
    /**
     * 获取请求的参数值
     *
     * @param req 请求
     * @param key 参数名
     * @return 参数值
     */
    public static String getReqParamVal(HttpServletRequest req, String key) {
        Map<String, String[]> maps = req.getParameterMap();
        for (Map.Entry<String, String[]> entry : maps.entrySet()) {
            if (entry.getKey().equalsIgnoreCase(key)) {
                return null == entry.getValue() || 0 == entry.getValue().length ? null : entry.getValue()[0];
            }
        }
        return null;
    }
    /**
     * 获取请求的参数值
     *
     * @param req 请求
     * @param key 参数名
     * @return 参数值
     */
    public static String[] getReqParamVals(HttpServletRequest req, String key) {
        Map<String, String[]> maps = req.getParameterMap();
        for (Map.Entry<String, String[]> entry : maps.entrySet()) {
            if (entry.getKey().equalsIgnoreCase(key)) {
                return entry.getValue();
            }
        }
        return null;
    }
}