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

com.litongjava.tio.http.common.HttpConfig Maven / Gradle / Ivy

There is a newer version: 3.7.3.v20241201-RELEASE
Show newest version
package com.litongjava.tio.http.common;

import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.net.URL;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Objects;
import java.util.Set;
import java.util.TreeMap;
import java.util.TreeSet;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.litongjava.model.cache.ICache;
import com.litongjava.tio.http.common.handler.ITioHttpRequestHandler;
import com.litongjava.tio.http.common.session.HttpSession;
import com.litongjava.tio.http.common.session.id.ISessionIdGenerator;
import com.litongjava.tio.http.common.session.limiter.SessionRateLimiter;
import com.litongjava.tio.http.common.view.freemarker.FreemarkerConfig;
import com.litongjava.tio.utils.hutool.FileUtil;
import com.litongjava.tio.utils.hutool.StrUtil;

/**
 * @author tanyaowu 2017年8月15日 下午1:21:14
 */
public class HttpConfig {
  private static Logger log = LoggerFactory.getLogger(HttpConfig.class);
  /**
   * 用于覆盖session cookie的参数名,客户端可以用这个传递sessionid
   */
  public static final String TIO_HTTP_SESSIONID = "tio_http_sessionid";
  /**
   * 存放HttpSession对象的cacheName
   */
  public static final String SESSION_CACHE_NAME = "tio-h-s";
  /**
   * 存放sessionId的cookie value
   */
  public static final String SESSION_COOKIE_NAME = "PHPSESSID";
  /**
   * session默认的超时时间,单位:秒
   */
  public static final long DEFAULT_SESSION_TIMEOUT = 30 * 60;
  /**
   * 默认的静态资源缓存时间,单位:秒
   */
  public static final int MAX_LIVETIME_OF_STATICRES = 60 * 10;
  /**
   * 文件上传时,boundary值的最大长度
   */
  public static final int MAX_LENGTH_OF_BOUNDARY = 512;
  /**
   * 文件上传时,头部的最大长度
   */
  public static final int MAX_LENGTH_OF_MULTI_HEADER = 512;
  /**
   * 文件上传时,体的最大长度(默认值2M)
   */
  public static final int MAX_LENGTH_OF_MULTI_BODY = 1024 * 1024 * 2;
  /**
   * 文件上传时,体的最大长度
   */
  private int maxLengthOfMultiBody = MAX_LENGTH_OF_MULTI_BODY;
  /**
   * POST体的最大长度默认值(2M)
   */
  public static final int MAX_LENGTH_OF_POST_BODY = 1024 * 1024 * 2;
  /**
   * jsonp时,回调参数名
   */
  public static final String JSONP_PARAM_NAME = "tio_http_jsonp";
  /**
   * POST体的最大长度
   */
  private int maxLengthOfPostBody = MAX_LENGTH_OF_POST_BODY;
  public static final int MAX_FORWARD_COUNT = 10;
  public int maxForwardCount = MAX_FORWARD_COUNT;
  /**
   * 是否使用session
   */
  private boolean useSession = true;
  /**
   * 是否兼容1.0 true:兼容 false:不兼容 默认兼容
   */
  public boolean compatible1_0 = true;
  /**
   * 是否拼接http request header value
   * 
   */
  private boolean appendRequestHeaderString = false;
  private String bindIp = null; // "127.0.0.1";
  /**
   * 监听端口
   */
  private Integer bindPort = 80;
  private String serverInfo = HttpConst.SERVER_INFO;
  private String charset = HttpConst.CHARSET_NAME;
  private ICache sessionStore = null;
  public SessionRateLimiter sessionRateLimiter;
  /**
   * 访问路径前缀,譬如"/api"
   */
  private String contextPath = "";
  /**
   * 加后缀,譬如".php"
   */
  private String suffix = "";
  /**
   * 如果访问路径是以"/"结束,则实际访问路径会自动加上welcomeFile,从而变成形如"/index.html"的路径
   */
  private String welcomeFile = null;
  /**
   * 允许访问的域名,如果不限制,则为null
   */
  private String[] allowDomains = null;
  /**
   * 存放HttpSession对象的cacheName
   */
  private String sessionCacheName = SESSION_CACHE_NAME;
  /**
   * session超时时间,单位:秒
   */
  private long sessionTimeout = DEFAULT_SESSION_TIMEOUT;
  private String sessionCookieName = SESSION_COOKIE_NAME;
  /**
   * 静态资源缓存时间,如果小于等于0则不缓存,单位:秒
   */
  private int maxLiveTimeOfStaticRes = MAX_LIVETIME_OF_STATICRES;
  //  private String page404 = "/404.html";
  private String page404 = null;
  //  private String page500 = "/500.html";
  private String page500 = null;
  private ISessionIdGenerator sessionIdGenerator;
  private ITioHttpRequestHandler httpRequestHandler;
  /**
   * ip被拉黑时,服务器给的响应,如果是null,服务器会直接断开连接
   */
  private HttpResponse respForBlackIp = null;
  /**
   * 是否被代理
   */
  private boolean isProxied = false;
  /**
   * 示例: 1、classpath中:classpath:page 2、绝对路径:/page
   */
  private String pageRoot = null; // FileUtil.getAbsolutePath("page");//"/page";
  private boolean pageInClasspath = false;
  /**
   * 临时支持freemarker,主要用于开发环境中的前端开发,暂时不重点作为tio-http-server功能
* 请大家暂时不要使用该功能,因为api随时会变 */ private FreemarkerConfig freemarkerConfig = null; /** * 域名和页面根目录映射。当客户端通过不同域名访问时,其页面根目录是不一样的
* key: www.t-io.org
* value: 域名对应的页面根目录
*/ private volatile Map domainPageMap = null; // new HashMap<>(); public boolean checkHost = false; private String name = null; /** * jsonp时,回调参数名 */ private String jsonpParamName = JSONP_PARAM_NAME; /** * 是否监控文件变化 */ public boolean monitorFileChange = false; public Map getDomainPageMap() { return domainPageMap; } public HttpConfig(Integer bindPort, boolean useSession) { this.bindPort = bindPort; this.useSession = useSession; } /** * * @param bindPort * @param sessionTimeout session超时时间,单位:秒 * @param contextPath * @param suffix */ public HttpConfig(Integer bindPort, Long sessionTimeout, String contextPath, String suffix) { this.bindPort = bindPort; if (sessionTimeout != null) { this.sessionTimeout = sessionTimeout; } if (contextPath == null) { contextPath = ""; } this.contextPath = contextPath; if (suffix == null) { suffix = ""; } this.suffix = suffix; } /** * @return the bindIp */ public String getBindIp() { return bindIp; } /** * @return the bindPort */ public Integer getBindPort() { return bindPort; } /** * @return the charset */ public String getCharset() { return charset; } /** * @return the maxLiveTimeOfStaticRes */ public int getMaxLiveTimeOfStaticRes() { return maxLiveTimeOfStaticRes; } public String getPage404() { return page404; } public String getPage500() { return page500; } /** * @return the pageRoot */ public String getPageRoot() { return pageRoot; } public String getPageRoot(HttpRequest request) { if (domainPageMap == null || domainPageMap.isEmpty()) { return pageRoot; } String domain = request.getDomain(); String root = domainPageMap.get(domain); if (root != null) { return root; } Set> set = domainPageMap.entrySet(); for (Entry entry : set) { String d = entry.getKey(); if (d.startsWith(".") && domain.endsWith(d)) { String file = entry.getValue(); domainPageMap.put(domain, file); return file; } } domainPageMap.put(domain, pageRoot); return pageRoot; } /** * * @param request * @param path 形如 /xx/aa.html * @return * @throws Exception * @author tanyaowu */ public HttpResource getResource(HttpRequest request, String path) throws Exception { String pageRoot = getPageRoot(request); HttpResource httpResource = null; if (pageRoot != null) { if (StrUtil.endWith(path, "/")) { path = path + "index.html"; } String complatePath = pageRoot + path; if (pageInClasspath) { URL url = this.getClass().getClassLoader().getResource(complatePath); if (url != null) { String protocol = url.getProtocol(); if (Objects.equals(protocol, "jar")) { httpResource = new HttpResource(path, url, null); } else { File file = new File(url.toURI()); if (file.exists()) { httpResource = new HttpResource(path, null, file); } } } } else { File file = new File(complatePath); if (file.exists()) { httpResource = new HttpResource(path, null, file); } } } return httpResource; } /** * @return the serverInfo */ public String getServerInfo() { return serverInfo; } /** * @return the sessionCacheName */ public String getSessionCacheName() { return sessionCacheName; } public String getSessionCookieName() { return sessionCookieName; } // public void setSessionTimeout(long sessionTimeout) { // this.sessionTimeout = sessionTimeout; // } public ISessionIdGenerator getSessionIdGenerator() { return sessionIdGenerator; } public ICache getSessionStore() { return sessionStore; } public long getSessionTimeout() { return sessionTimeout; } /** * @param bindIp the bindIp to set */ public void setBindIp(String bindIp) { this.bindIp = bindIp; } /** * @param charset the charset to set */ public void setCharset(String charset) { this.charset = charset; } /** * @param maxLiveTimeOfStaticRes the maxLiveTimeOfStaticRes to set */ public void setMaxLiveTimeOfStaticRes(int maxLiveTimeOfStaticRes) { this.maxLiveTimeOfStaticRes = maxLiveTimeOfStaticRes; } public void setPage404(String page404) { this.page404 = page404; } public void setPage500(String page500) { this.page500 = page500; } /** * 静态文件路径,必须先设置好pageRoot后再用 key: 文件名后缀 path: 访问路径 如 /user/set.html */ private Map> staticPathsMap = null; /** * path: 访问路径 如 /user/set.html */ private Set staticPaths = null; public Map> getStaticPathsMap() { initStaticPaths(); return staticPathsMap; } public Set getStaticPaths() { initStaticPaths(); return staticPaths; } private Map> initStaticPaths() { if (staticPathsMap != null) { return staticPathsMap; } if (pageInClasspath) { throw new RuntimeException("classpath的pageRoot是"); } staticPathsMap = new TreeMap<>(); staticPaths = new TreeSet<>(); List files = FileUtil.loopFiles(pageRoot, new FileFilter() { @Override public boolean accept(File file) { String filename = file.getName(); String ext = FileUtil.extName(filename);// .getExtension(filename); if (file.isDirectory()) { if ("svn-base".equalsIgnoreCase(ext)) { return false; } return true; } // String ext = FileUtil.extName(file); return true; } }); if (files == null) { return staticPathsMap; } if (log.isInfoEnabled()) { log.info("一共{}个文件", files.size()); } File pageRootFile = new File(pageRoot); String pageRootAbs; try { pageRootAbs = pageRootFile.getCanonicalPath(); } catch (IOException e1) { log.error(e1.toString(), e1); return null; } for (File file : files) { try { if (file.isDirectory()) { } else { String absPath = file.getCanonicalPath(); // long start = System.currentTimeMillis(); String path = absPath.substring(pageRootAbs.length()); path = path.replaceAll("\\\\", "/"); if (!(path.startsWith("/"))) { path = "/" + path; } log.info("访问路径:{}", path); String ext = FileUtil.extName(path); Set set = staticPathsMap.get(ext); if (set == null) { set = new TreeSet<>(); staticPathsMap.put(ext, set); } set.add(path); staticPaths.add(path); } } catch (Exception e) { log.error(e.toString()); } } return staticPathsMap; } /** * 获取文件的URL访问路径 * * @param file * @return * @throws IOException */ public String getPath(File file) throws IOException { String absPath = file.getCanonicalPath(); File pageRootFile = new File(pageRoot); String pageRootAbs = pageRootFile.getCanonicalPath(); String path = absPath.substring(pageRootAbs.length()); path = path.replaceAll("\\\\", "/"); if (!(path.startsWith("/"))) { path = "/" + path; } return path; } /** * * @param pageRoot 如果是以"classpath:"开头,则从classpath中查找,否则视为普通的文件路径 * @author tanyaowu * @throws IOException */ public void setPageRoot(String pageRoot) { staticPathsMap = null; if (StrUtil.startWith(pageRoot, "classpath:")) { this.pageRoot = pageRoot.substring("classpath:".length()); if (this.pageRoot.startsWith("/")) { this.pageRoot = this.pageRoot.substring(1); } this.pageInClasspath = true; } else { this.pageRoot = pageRoot;// fromPath(pageRoot); } } /** * * @param domain 形如www.t-io.org的域名,也可以是形如.t-io.org这样的通配域名 * @param pageRoot 如果是以"classpath:"开头,则从classpath中查找,否则视为普通的文件路径 * @throws IOException */ public void addDomainPage(String domain, String pageRoot) throws IOException { if (domainPageMap == null) { synchronized (this) { if (domainPageMap == null) { domainPageMap = new HashMap<>(); } } } domainPageMap.put(domain, pageRoot); if (this.freemarkerConfig != null) { freemarkerConfig.addDomainConfiguration(domain, pageRoot); } } /** * @param serverInfo the serverInfo to set */ public void setServerInfo(String serverInfo) { this.serverInfo = serverInfo; } /** * @param sessionCacheName the sessionCacheName to set */ public void setSessionCacheName(String sessionCacheName) { this.sessionCacheName = sessionCacheName; } public void setSessionCookieName(String sessionCookieName) { this.sessionCookieName = sessionCookieName; } public void setSessionIdGenerator(ISessionIdGenerator sessionIdGenerator) { this.sessionIdGenerator = sessionIdGenerator; } public void setSessionStore(ICache sessionStore) { this.sessionStore = sessionStore; // this.httpSessionManager = HttpSessionManager.getInstance(sessionStore); } /** * @return the httpRequestHandler */ public ITioHttpRequestHandler getHttpRequestHandler() { return httpRequestHandler; } /** * @param httpRequestHandler the httpRequestHandler to set */ public void setHttpRequestHandler(ITioHttpRequestHandler httpRequestHandler) { this.httpRequestHandler = httpRequestHandler; } public String getContextPath() { return contextPath; } public String getSuffix() { return suffix; } public String[] getAllowDomains() { return allowDomains; } public void setAllowDomains(String[] allowDomains) { this.allowDomains = allowDomains; } /** * @return the isProxied */ public boolean isProxied() { return isProxied; } /** * @param isProxied the isProxied to set */ public void setProxied(boolean isProxied) { this.isProxied = isProxied; } public boolean isUseSession() { return useSession; } public void setUseSession(boolean useSession) { this.useSession = useSession; } /** * 根据sessionId获取HttpSession对象 * * @param sessionId * @return */ public HttpSession getHttpSession(String sessionId) { if (StrUtil.isBlank(sessionId)) { return null; } HttpSession httpSession = (HttpSession) getSessionStore().get(sessionId); return httpSession; } public String getWelcomeFile() { return welcomeFile; } public void setWelcomeFile(String welcomeFile) { this.welcomeFile = welcomeFile; } public FreemarkerConfig getFreemarkerConfig() { return freemarkerConfig; } public void setFreemarkerConfig(FreemarkerConfig freemarkerConfig) { this.freemarkerConfig = freemarkerConfig; } /** * @return the appendRequestHeaderString */ public boolean isAppendRequestHeaderString() { return appendRequestHeaderString; } /** * @param appendRequestHeaderString the appendRequestHeaderString to set */ public void setAppendRequestHeaderString(boolean appendRequestHeaderString) { this.appendRequestHeaderString = appendRequestHeaderString; } /** * @return the maxLengthOfMultiBody */ public int getMaxLengthOfMultiBody() { return maxLengthOfMultiBody; } /** * @param maxLengthOfMultiBody the maxLengthOfMultiBody to set */ public void setMaxLengthOfMultiBody(int maxLengthOfMultiBody) { this.maxLengthOfMultiBody = maxLengthOfMultiBody; } public HttpResponse getRespForBlackIp() { return respForBlackIp; } public void setRespForBlackIp(HttpResponse respForBlackIp) { this.respForBlackIp = respForBlackIp; } /** * @param checkHost * @author tanyaowu */ public void setCheckHost(boolean checkHost) { this.checkHost = checkHost; } public void setCompatible1_0(boolean compatible1_0) { this.compatible1_0 = compatible1_0; } public boolean isPageInClasspath() { return pageInClasspath; } public void setPageInClasspath(boolean pageInClasspath) { this.pageInClasspath = pageInClasspath; } public SessionRateLimiter getSessionRateLimiter() { return sessionRateLimiter; } public void setSessionRateLimiter(SessionRateLimiter sessionRateLimiter) { this.sessionRateLimiter = sessionRateLimiter; } public int getMaxForwardCount() { return maxForwardCount; } public void setMaxForwardCount(int maxForwardCount) { this.maxForwardCount = maxForwardCount; } public int getMaxLengthOfPostBody() { return maxLengthOfPostBody; } public void setMaxLengthOfPostBody(int maxLengthOfPostBody) { this.maxLengthOfPostBody = maxLengthOfPostBody; } /** * @return the name */ public String getName() { return name; } /** * @param name the name to set */ public void setName(String name) { this.name = name; } public String getJsonpParamName() { return jsonpParamName; } public void setJsonpParamName(String jsonpParamName) { this.jsonpParamName = jsonpParamName; } public boolean isMonitorFileChange() { return monitorFileChange; } public void setMonitorFileChange(boolean monitorFileChange) { this.monitorFileChange = monitorFileChange; } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy