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

icu.easyj.web.util.HttpUtils Maven / Gradle / Ivy

/*
 * Copyright 2021 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package icu.easyj.web.util;

import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import cn.hutool.core.text.CharPool;
import cn.hutool.core.text.StrPool;
import icu.easyj.core.constant.DateFormatConstants;
import icu.easyj.core.util.StringUtils;
import icu.easyj.web.constant.HttpConstants;
import icu.easyj.web.constant.HttpHeaderConstants;
import icu.easyj.web.exception.RequestContextNotFoundException;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.springframework.lang.NonNull;
import org.springframework.lang.Nullable;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import static icu.easyj.web.constant.HttpHeaderConstants.NO_CACHE;
import static icu.easyj.web.constant.HttpHeaderConstants.NO_STORE;

/**
 * HTTP工具类
 *
 * @author wangliang181230
 */
public abstract class HttpUtils {

	//region 获取`HttpServletRequest`和`HttpServletResponse`

	/**
	 * 获取 HttpServletRequest
	 *
	 * @return request 请求实例
	 * @throws RequestContextNotFoundException HTTP请求上下文不存在的异常
	 */
	@NonNull
	public static HttpServletRequest getRequest() throws RequestContextNotFoundException {
		ServletRequestAttributes requestAttributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
		if (requestAttributes == null) {
			throw new RequestContextNotFoundException();
		}

		// 上下文存在时,request肯定存在,无需判断空
		return requestAttributes.getRequest();
	}

	/**
	 * 获取 HttpServletResponse
	 *
	 * @return response 响应实例
	 * @throws RequestContextNotFoundException HTTP请求上下文不存在的异常
	 */
	@NonNull
	public static HttpServletResponse getResponse() throws RequestContextNotFoundException {
		ServletRequestAttributes requestAttributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
		if (requestAttributes == null) {
			throw new RequestContextNotFoundException();
		}

		// 上下文存在时,response不一定已经存在,判断一下空值。
		HttpServletResponse response = requestAttributes.getResponse();
		if (response == null) {
			throw new RequestContextNotFoundException();
		}

		return response;
	}

	//endregion


	//region 获取请求、响应内容

	/**
	 * 获取二级目录
	 *
	 * @param context 上下文
	 * @return contextPath 二级目录
	 */
	public static String getContextPath(@NonNull ServletContext context) {
		String contextPath = context.getContextPath();

		if (contextPath == null || contextPath.isEmpty()) {
			return StrPool.SLASH;
		} else {
			return contextPath;
		}
	}

	/**
	 * 获取没有二级目录的请求路径
	 *
	 * @param uri         完整请求路径
	 * @param contextPath 二级目录
	 * @return noContextPathUri 排除了二级目录的请求路径
	 */
	@NonNull
	public static String getNoContextPathUri(String uri, @Nullable String contextPath) {
		if (uri == null) {
			return StrPool.SLASH;
		}

		if (contextPath == null || contextPath.isEmpty() || StrPool.SLASH.equals(contextPath)) {
			return uri;
		}
		if (uri.startsWith(contextPath)) {
			uri = uri.substring(contextPath.length());
		}
		return uri;
	}

	//endregion


	//region 校验请求信息 start

	/**
	 * 判断是否GET请求
	 *
	 * @param request 请求实例
	 * @return isGetRequest 是否为GET请求
	 */
	public static boolean isGetRequest(HttpServletRequest request) {
		return HttpMethod.GET.name().equalsIgnoreCase(request.getMethod());
	}

	// 重载方法
	public static boolean isGetRequest() {
		return isGetRequest(getRequest());
	}

	/**
	 * 判断是否不是GET请求
	 *
	 * @param request 请求实例
	 * @return isGetRequest 是否为GET请求
	 */
	public static boolean isNotGetRequest(HttpServletRequest request) {
		return !isGetRequest(request);
	}

	// 重载方法
	public static boolean isNotGetRequest() {
		return !isGetRequest();
	}

	/**
	 * 判断是否POST请求
	 *
	 * @param request 请求实例
	 * @return isPostRequest 是否为POST请求
	 */
	public static boolean isPostRequest(HttpServletRequest request) {
		return HttpMethod.POST.name().equalsIgnoreCase(request.getMethod());
	}

	// 重载方法
	public static boolean isPostRequest() {
		return isPostRequest(getRequest());
	}

	/**
	 * 判断是否不是POST请求
	 *
	 * @param request 请求实例
	 * @return isPostRequest 是否为POST请求
	 */
	public static boolean isNotPostRequest(HttpServletRequest request) {
		return !isPostRequest(request);
	}

	// 重载方法
	public static boolean isNotPostRequest() {
		return !isPostRequest();
	}

	/**
	 * 判断是否OPTIONS请求
	 *
	 * @param request 请求实例
	 * @return isGetRequest 是否为GET请求
	 */
	public static boolean isOptionsRequest(HttpServletRequest request) {
		return HttpMethod.OPTIONS.name().equalsIgnoreCase(request.getMethod());
	}

	// 重载方法
	public static boolean isOptionsRequest() {
		return isOptionsRequest(getRequest());
	}

	/**
	 * 判断是否不是OPTIONS请求
	 *
	 * @param request 请求实例
	 * @return isGetRequest 是否为GET请求
	 */
	public static boolean isNotOptionsRequest(HttpServletRequest request) {
		return !isOptionsRequest(request);
	}

	// 重载方法
	public static boolean isNotOptionsRequest() {
		return !isOptionsRequest();
	}

	/**
	 * 判断是否为无缓存请求
	 *
	 * @param request 请求实例
	 * @return isNoCacheRequest 是否为无缓存请求
	 */
	public static boolean isNoCacheRequest(HttpServletRequest request) {
		String cacheControl = request.getHeader(HttpHeaders.CACHE_CONTROL);
		if (StringUtils.isNotEmpty(cacheControl)) {
			cacheControl = cacheControl.toLowerCase();
			return cacheControl.contains(NO_CACHE) || cacheControl.contains(NO_STORE);
		}
		return false;
	}

	// 重载方法
	public static boolean isNoCacheRequest() {
		return isNoCacheRequest(getRequest());
	}

	//region 来自内部服务器的请求相关 start

	private static final ThreadLocal INTERNAL_REQUEST_FLAG = new ThreadLocal<>();

	/**
	 * 判断是否来自内部服务器的请求
	 *
	 * @return isInternalRequest 是否来自内部服务器的请求
	 */
	public static boolean isInternalRequest() {
		return Boolean.TRUE.equals(INTERNAL_REQUEST_FLAG.get());
	}

	/**
	 * 设置当前请求为 来自内部服务器的请求
	 */
	public static void setInternalRequest() {
		INTERNAL_REQUEST_FLAG.set(true);
	}

	/**
	 * 清除`INTERNAL_REQUEST_FLAG`
	 */
	public static void clearInternalRequest() {
		INTERNAL_REQUEST_FLAG.remove();
	}

	//endregion 来自内部服务器的请求相关 end

	//endregion 校验请求信息 end


	//region 设置响应信息 start

	/**
	 * 设置响应状态为304
	 *
	 * @param response 响应实例
	 */
	public static void setResponseStatus304(HttpServletResponse response) {
		response.setStatus(HttpStatus.NOT_MODIFIED.value());
	}

	// 重载方法
	public static void setResponseStatus304() {
		setResponseStatus304(getResponse());
	}

	/**
	 * 设置响应信息,使该请求不允许被缓存
	 *
	 * @param response 响应实例
	 */
	public static void setResponseNotAllowCache(HttpServletResponse response) {
		response.setHeader(HttpHeaders.CACHE_CONTROL, HttpHeaderConstants.NO_CACHE);
		response.setDateHeader(HttpHeaders.EXPIRES, 0);
	}

	//endregion 设置响应信息end


	//region 文件导出相关 start

	/**
	 * 判断是否为导出文件请求
	 *
	 * @param request 请求实例
	 * @return isDoExportRequest 是否为导出文件请求
	 */
	public static boolean isDoExportRequest(HttpServletRequest request) {
		return HttpConstants.DO_EXPORT_PARAM_VALUE.equalsIgnoreCase(request.getParameter(HttpConstants.DO_EXPORT_PARAM_NAME));
	}

	// 重载方法
	public static boolean isDoExportRequest() {
		return isDoExportRequest(getRequest());
	}

	/**
	 * 生成导出文件的文件名
	 *
	 * @param fileNamePre 文件名前缀
	 * @param fileSuffix  文件后续名
	 * @return fileName 导出的文件名
	 */
	public static String generateExportFileName(@NonNull String fileNamePre, String fileSuffix) {
		if (!fileNamePre.endsWith(StrPool.UNDERLINE)) {
			fileNamePre += StrPool.UNDERLINE;
		}

		SimpleDateFormat sdf = new SimpleDateFormat(DateFormatConstants.SSS_UNSIGNED);
		return fileNamePre + sdf.format(new Date()) + (fileSuffix.charAt(0) != CharPool.DOT ? CharPool.DOT : "") + fileSuffix;
	}

	//endregion 文件导出相关 end
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy