|  | @@ -0,0 +1,184 @@
 | 
	
		
			
				|  |  | +package com.ruoyi.common.core.utils.web;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +import com.alibaba.fastjson.JSON;
 | 
	
		
			
				|  |  | +import com.ruoyi.common.core.exception.CheckedException;
 | 
	
		
			
				|  |  | +import org.bouncycastle.util.encoders.Base64;
 | 
	
		
			
				|  |  | +import org.slf4j.Logger;
 | 
	
		
			
				|  |  | +import org.slf4j.LoggerFactory;
 | 
	
		
			
				|  |  | +import org.springframework.http.HttpHeaders;
 | 
	
		
			
				|  |  | +import org.springframework.http.MediaType;
 | 
	
		
			
				|  |  | +import org.springframework.http.server.reactive.ServerHttpRequest;
 | 
	
		
			
				|  |  | +import org.springframework.util.Assert;
 | 
	
		
			
				|  |  | +import org.springframework.web.bind.annotation.ResponseBody;
 | 
	
		
			
				|  |  | +import org.springframework.web.context.request.RequestContextHolder;
 | 
	
		
			
				|  |  | +import org.springframework.web.context.request.ServletRequestAttributes;
 | 
	
		
			
				|  |  | +import org.springframework.web.method.HandlerMethod;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +import javax.servlet.http.Cookie;
 | 
	
		
			
				|  |  | +import javax.servlet.http.HttpServletRequest;
 | 
	
		
			
				|  |  | +import javax.servlet.http.HttpServletResponse;
 | 
	
		
			
				|  |  | +import java.io.IOException;
 | 
	
		
			
				|  |  | +import java.io.PrintWriter;
 | 
	
		
			
				|  |  | +import java.io.UnsupportedEncodingException;
 | 
	
		
			
				|  |  | +import java.nio.charset.StandardCharsets;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +public class WebUtils extends org.springframework.web.util.WebUtils
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +    private final Logger logger = LoggerFactory.getLogger(WebUtils.class);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    private static final String BASIC_ = "Basic ";
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +//    /**
 | 
	
		
			
				|  |  | +//     * 判断是否ajax请求 spring ajax 返回含有 ResponseBody 或者 RestController注解
 | 
	
		
			
				|  |  | +//     *
 | 
	
		
			
				|  |  | +//     * @param handlerMethod HandlerMethod
 | 
	
		
			
				|  |  | +//     * @return 是否ajax请求
 | 
	
		
			
				|  |  | +//     */
 | 
	
		
			
				|  |  | +//    public boolean isBody(HandlerMethod handlerMethod)
 | 
	
		
			
				|  |  | +//    {
 | 
	
		
			
				|  |  | +//        ResponseBody responseBody = ClassUtils.getAnnotation(handlerMethod, ResponseBody.class);
 | 
	
		
			
				|  |  | +//        return responseBody != null;
 | 
	
		
			
				|  |  | +//    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 读取cookie
 | 
	
		
			
				|  |  | +     *
 | 
	
		
			
				|  |  | +     * @param name cookie name
 | 
	
		
			
				|  |  | +     * @return cookie value
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    public String getCookieVal(String name)
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        HttpServletRequest request = WebUtils.getRequest();
 | 
	
		
			
				|  |  | +        Assert.notNull(request, "request from RequestContextHolder is null");
 | 
	
		
			
				|  |  | +        return getCookieVal(request, name);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 读取cookie
 | 
	
		
			
				|  |  | +     *
 | 
	
		
			
				|  |  | +     * @param request HttpServletRequest
 | 
	
		
			
				|  |  | +     * @param name cookie name
 | 
	
		
			
				|  |  | +     * @return cookie value
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    public String getCookieVal(HttpServletRequest request, String name)
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        Cookie cookie = getCookie(request, name);
 | 
	
		
			
				|  |  | +        return cookie != null ? cookie.getValue() : null;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 清除 某个指定的cookie
 | 
	
		
			
				|  |  | +     *
 | 
	
		
			
				|  |  | +     * @param response HttpServletResponse
 | 
	
		
			
				|  |  | +     * @param key cookie key
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    public void removeCookie(HttpServletResponse response, String key)
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        setCookie(response, key, null, 0);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 设置cookie
 | 
	
		
			
				|  |  | +     *
 | 
	
		
			
				|  |  | +     * @param response HttpServletResponse
 | 
	
		
			
				|  |  | +     * @param name cookie name
 | 
	
		
			
				|  |  | +     * @param value cookie value
 | 
	
		
			
				|  |  | +     * @param maxAgeInSeconds maxage
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    public void setCookie(HttpServletResponse response, String name, String value, int maxAgeInSeconds)
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        Cookie cookie = new Cookie(name, value);
 | 
	
		
			
				|  |  | +        cookie.setPath("/");
 | 
	
		
			
				|  |  | +        cookie.setMaxAge(maxAgeInSeconds);
 | 
	
		
			
				|  |  | +        cookie.setHttpOnly(true);
 | 
	
		
			
				|  |  | +        response.addCookie(cookie);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 获取 HttpServletRequest
 | 
	
		
			
				|  |  | +     *
 | 
	
		
			
				|  |  | +     * @return {HttpServletRequest}
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    public static HttpServletRequest getRequest()
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 获取 HttpServletResponse
 | 
	
		
			
				|  |  | +     *
 | 
	
		
			
				|  |  | +     * @return {HttpServletResponse}
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    public HttpServletResponse getResponse()
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 返回json
 | 
	
		
			
				|  |  | +     *
 | 
	
		
			
				|  |  | +     * @param response HttpServletResponse
 | 
	
		
			
				|  |  | +     * @param result 结果对象
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    public void renderJson(HttpServletResponse response, Object result)
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        renderJson(response, result, MediaType.APPLICATION_JSON_VALUE);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 返回json
 | 
	
		
			
				|  |  | +     *
 | 
	
		
			
				|  |  | +     * @param response HttpServletResponse
 | 
	
		
			
				|  |  | +     * @param result 结果对象
 | 
	
		
			
				|  |  | +     * @param contentType contentType
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    public void renderJson(HttpServletResponse response, Object result, String contentType)
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        response.setCharacterEncoding("UTF-8");
 | 
	
		
			
				|  |  | +        response.setContentType(contentType);
 | 
	
		
			
				|  |  | +        try (PrintWriter out = response.getWriter())
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            out.append(JSON.toJSONString(result));
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        catch (IOException e)
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            logger.error(e.getMessage(), e);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 从request 获取CLIENT_ID
 | 
	
		
			
				|  |  | +     *
 | 
	
		
			
				|  |  | +     * @return
 | 
	
		
			
				|  |  | +     * @throws UnsupportedEncodingException
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    public static String[] getClientId(ServerHttpRequest request) throws UnsupportedEncodingException
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        String header = request.getHeaders().getFirst(HttpHeaders.AUTHORIZATION);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        if (header == null || !header.startsWith(BASIC_))
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            throw new CheckedException("请求头中client信息为空");
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        byte[] base64Token = header.substring(6).getBytes("UTF-8");
 | 
	
		
			
				|  |  | +        byte[] decoded;
 | 
	
		
			
				|  |  | +        try
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            decoded = Base64.decode(base64Token);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        catch (IllegalArgumentException e)
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            throw new CheckedException("Failed to decode basic authentication token");
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        String token = new String(decoded, StandardCharsets.UTF_8);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        int delim = token.indexOf(":");
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        if (delim == -1)
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            throw new CheckedException("Invalid basic authentication token");
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        return new String[] { token.substring(0, delim), token.substring(delim + 1) };
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +}
 |