WebUtil.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566
  1. using log4net;
  2. using Microsoft.AspNetCore.Hosting;
  3. using Microsoft.AspNetCore.Http;
  4. using Microsoft.Extensions.DependencyInjection;
  5. using Newtonsoft.Json;
  6. using NPOI.SS.Formula.Functions;
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Net.NetworkInformation;
  10. using System.Runtime.CompilerServices;
  11. using System.Text;
  12. using System.Text.RegularExpressions;
  13. using System.Web;
  14. namespace WMS.Util
  15. {
  16. /// <summary>
  17. /// 描 述:Web操作
  18. /// </summary>
  19. public class WebUtil
  20. {
  21. #region HttpContextAccessor(Http上下文访问器)
  22. /// <summary>
  23. /// Http上下文访问器
  24. /// </summary>
  25. public static IHttpContextAccessor HttpContextAccessor
  26. {
  27. get
  28. {
  29. var serviceProvider = new ServiceCollection().AddSingleton<IHttpContextAccessor, HttpContextAccessor>()
  30. .BuildServiceProvider();
  31. return serviceProvider.GetService<IHttpContextAccessor>();
  32. }
  33. set { }
  34. }
  35. #endregion
  36. #region HttpContext(Http上下文)
  37. /// <summary>
  38. /// 当前Http上下文
  39. /// </summary>
  40. public static HttpContext HttpContext => HttpContextAccessor?.HttpContext;
  41. #endregion
  42. #region ServiceProvider(服务提供器)
  43. /// <summary>
  44. /// 当前Http请求服务提供器
  45. /// </summary>
  46. public static IServiceProvider ServiceProvider => HttpContext?.RequestServices;
  47. #endregion
  48. #region Request(Http请求)
  49. /// <summary>
  50. /// 当前Http请求
  51. /// </summary>
  52. public static HttpRequest Request => HttpContext?.Request;
  53. #endregion
  54. #region Host(获取主机名)
  55. /// <summary>
  56. /// 获取主机名,即域名,
  57. /// 范例:用户输入网址http://www.a.com/b.htm?a=1&amp;b=2,
  58. /// 返回值为: www.a.com
  59. /// </summary>
  60. public static string Host
  61. {
  62. get
  63. {
  64. return HttpContext.Request.Host.Value;
  65. }
  66. }
  67. #endregion
  68. #region ResolveUrl(解析相对Url)
  69. /// <summary>
  70. /// 解析相对Url
  71. /// </summary>
  72. /// <param name="relativeUrl">相对Url</param>
  73. public static string ResolveUrl(string relativeUrl)
  74. {
  75. if (string.IsNullOrWhiteSpace(relativeUrl))
  76. return string.Empty;
  77. relativeUrl = relativeUrl.Replace("\\", "/");
  78. if (relativeUrl.StartsWith("/"))
  79. return relativeUrl;
  80. if (relativeUrl.Contains("://"))
  81. return relativeUrl;
  82. return ToAbsolute(relativeUrl);
  83. }
  84. public static string ToAbsolute(string virtualPath)
  85. {
  86. if (string.IsNullOrEmpty(virtualPath))
  87. {
  88. return null;
  89. }
  90. return Path.Combine(ConfigHelper.GetValue<string>("baseDir"), virtualPath.TrimStart('~', '/').Replace('/', Path.DirectorySeparatorChar));
  91. }
  92. #endregion
  93. #region HtmlEncode(对html字符串进行编码)
  94. /// <summary>
  95. /// 对html字符串进行编码
  96. /// </summary>
  97. /// <param name="html">html字符串</param>
  98. public static string HtmlEncode(string html)
  99. {
  100. return HttpUtility.HtmlEncode(html);
  101. }
  102. /// <summary>
  103. /// 对html字符串进行解码
  104. /// </summary>
  105. /// <param name="html">html字符串</param>
  106. public static string HtmlDecode(string html)
  107. {
  108. return HttpUtility.HtmlDecode(html);
  109. }
  110. #endregion
  111. #region UrlEncode(对Url进行编码)
  112. /// <summary>
  113. /// 对Url进行编码
  114. /// </summary>
  115. /// <param name="url">url</param>
  116. /// <param name="isUpper">编码字符是否转成大写,范例,"http://"转成"http%3A%2F%2F"</param>
  117. public static string UrlEncode(string url, bool isUpper = false)
  118. {
  119. return UrlEncode(url, Encoding.UTF8, isUpper);
  120. }
  121. /// <summary>
  122. /// 对Url进行编码
  123. /// </summary>
  124. /// <param name="url">url</param>
  125. /// <param name="encoding">字符编码</param>
  126. /// <param name="isUpper">编码字符是否转成大写,范例,"http://"转成"http%3A%2F%2F"</param>
  127. public static string UrlEncode(string url, Encoding encoding, bool isUpper = false)
  128. {
  129. var result = HttpUtility.UrlEncode(url, encoding);
  130. if (!isUpper)
  131. return result;
  132. return GetUpperEncode(result);
  133. }
  134. /// <summary>
  135. /// 获取大写编码字符串
  136. /// </summary>
  137. /// <param name="encode">字串</param>
  138. /// <returns></returns>
  139. private static string GetUpperEncode(string encode)
  140. {
  141. var result = new StringBuilder();
  142. int index = int.MinValue;
  143. for (int i = 0; i < encode.Length; i++)
  144. {
  145. string character = encode[i].ToString();
  146. if (character == "%")
  147. index = i;
  148. if (i - index == 1 || i - index == 2)
  149. character = character.ToUpper();
  150. result.Append(character);
  151. }
  152. return result.ToString();
  153. }
  154. #endregion
  155. #region UrlDecode(对Url进行解码)
  156. /// <summary>
  157. /// 对Url进行解码,对于javascript的encodeURIComponent函数编码参数,应使用utf-8字符编码来解码
  158. /// </summary>
  159. /// <param name="url">url</param>
  160. public static string UrlDecode(string url)
  161. {
  162. return HttpUtility.UrlDecode(url);
  163. }
  164. /// <summary>
  165. /// 对Url进行解码,对于javascript的encodeURIComponent函数编码参数,应使用utf-8字符编码来解码
  166. /// </summary>
  167. /// <param name="url">url</param>
  168. /// <param name="encoding">字符编码,对于javascript的encodeURIComponent函数编码参数,应使用utf-8字符编码来解码</param>
  169. public static string UrlDecode(string url, Encoding encoding)
  170. {
  171. return HttpUtility.UrlDecode(url, encoding);
  172. }
  173. #endregion
  174. #region Session操作
  175. /// <summary>
  176. /// 写Session
  177. /// </summary>
  178. /// <typeparam name="T">Session键值的类型</typeparam>
  179. /// <param name="key">Session的键名</param>
  180. /// <param name="value">Session的键值</param>
  181. public static void WriteSession<T>(string key, T value)
  182. {
  183. if (key.IsEmpty())
  184. return;
  185. HttpContext.Session.SetString(key, JsonConvert.SerializeObject(value));
  186. }
  187. /// <summary>
  188. /// 写Session
  189. /// </summary>
  190. /// <param name="key">Session的键名</param>
  191. /// <param name="value">Session的键值</param>
  192. public static void WriteSession(string key, string value)
  193. {
  194. WriteSession<string>(key, value);
  195. }
  196. public static T? GetSession<T>(string key)
  197. {
  198. var value = HttpContext.Session.GetString(key);
  199. return value == null ? default : JsonConvert.DeserializeObject<T>(value);
  200. }
  201. /// <summary>
  202. /// 读取Session的值
  203. /// </summary>
  204. /// <param name="key">Session的键名</param>
  205. public static string? GetSession(string key)
  206. {
  207. if (key.IsEmpty())
  208. return string.Empty;
  209. var value = HttpContext.Session.GetString(key);
  210. return value == null ? default : value.ToString();
  211. }
  212. /// <summary>
  213. /// 删除指定Session
  214. /// </summary>
  215. /// <param name="key">Session的键名</param>
  216. public static void RemoveSession(string key)
  217. {
  218. if (key.IsEmpty())
  219. return;
  220. HttpContext.Session.Remove(key);
  221. }
  222. #endregion
  223. #region Cookie操作
  224. /// <summary>
  225. /// 写cookie值
  226. /// </summary>
  227. /// <param name="strName">名称</param>
  228. /// <param name="strValue">值</param>
  229. public static void WriteCookie(string strName, string strValue)
  230. {
  231. var cookieOptions = new CookieOptions
  232. {
  233. Domain = "zt.bozhon.com",
  234. HttpOnly = false,
  235. SameSite = SameSiteMode.None,
  236. Secure = true,
  237. Path = "/"
  238. };
  239. HttpContext.Response.Cookies.Append(strName, strValue, cookieOptions);
  240. }
  241. /// <summary>
  242. /// 写cookie值
  243. /// </summary>
  244. /// <param name="strName">名称</param>
  245. /// <param name="strValue">值</param>
  246. /// <param name="strValue">过期时间(分钟)</param>
  247. public static void WriteCookie(string strName, string strValue, int expires)
  248. {
  249. var cookieOptions = new CookieOptions
  250. {
  251. Domain="zt.bozhon.com",
  252. Expires = DateTime.Now.AddMinutes(expires),
  253. HttpOnly = false,
  254. SameSite = SameSiteMode.None,
  255. Secure = true,
  256. Path = "/"
  257. };
  258. HttpContext.Response.Cookies.Append(strName, strValue, cookieOptions);
  259. }
  260. /// <summary>
  261. /// 读cookie值
  262. /// </summary>
  263. /// <param name="strName">名称</param>
  264. /// <returns>cookie值</returns>
  265. public static string GetCookie(string strName)
  266. {
  267. if (HttpContext.Request.Cookies != null && HttpContext.Request.Cookies[strName] != null)
  268. {
  269. return HttpContext.Request.Cookies[strName];
  270. }
  271. return "";
  272. }
  273. /// <summary>
  274. /// 删除Cookie对象
  275. /// </summary>
  276. /// <param name="CookiesName">Cookie对象名称</param>
  277. public static void RemoveCookie(string CookiesName)
  278. {
  279. HttpContext.Response.Cookies.Delete(CookiesName);
  280. }
  281. #endregion
  282. //#region GetFileControls(获取客户端文件控件集合)
  283. ///// <summary>
  284. ///// 获取有效客户端文件控件集合,文件控件必须上传了内容,为空将被忽略,
  285. ///// 注意:Form标记必须加入属性 enctype = "multipart/form-data", 服务器端才能获取客户端file控件.
  286. ///// </summary>
  287. ///// <returns></returns>
  288. //public static List<IFormFile> GetFileControls()
  289. //{
  290. // var result = new List<IFormFile>();
  291. // var files = HttpContextAccessor.HttpContext.Items.f.f;
  292. // if (files.Count == 0)
  293. // return result;
  294. // for (int i = 0; i < files.Count; i++)
  295. // {
  296. // var file = files[i];
  297. // if (file.ContentLength == 0)
  298. // continue;
  299. // result.Add(files[i]);
  300. // }
  301. // return result;
  302. //}
  303. //#endregion
  304. //#region GetFileControl(获取第一个有效客户端文件控件)
  305. ///// <summary>
  306. ///// 获取第一个有效客户端文件控件,文件控件必须上传了内容,为空将被忽略,
  307. ///// 注意:Form标记必须加入属性 enctype="multipart/form-data",服务器端才能获取客户端file控件.
  308. ///// </summary>
  309. ///// <returns></returns>
  310. //public static HttpPostedFile GetFileControl()
  311. //{
  312. // var files = GetFileControls();
  313. // if (files == null || files.Count == 0)
  314. // return null;
  315. // return files[0];
  316. //}
  317. //#endregion
  318. #region 去除HTML标记
  319. /// <summary>
  320. /// 去除HTML标记
  321. /// </summary>
  322. /// <param name="NoHTML">包括HTML的源码 </param>
  323. /// <returns>已经去除后的文字</returns>
  324. public static string NoHtml(string Htmlstring)
  325. {
  326. //删除脚本
  327. Htmlstring = Regex.Replace(Htmlstring, @"<script[^>]*?>.*?</script>", "", RegexOptions.IgnoreCase);
  328. //删除HTML
  329. Htmlstring = Regex.Replace(Htmlstring, @"<(.[^>]*)>", "", RegexOptions.IgnoreCase);
  330. Htmlstring = Regex.Replace(Htmlstring, @"([\r\n])[\s]+", "", RegexOptions.IgnoreCase);
  331. Htmlstring = Regex.Replace(Htmlstring, @"-->", "", RegexOptions.IgnoreCase);
  332. Htmlstring = Regex.Replace(Htmlstring, @"<!--.*", "", RegexOptions.IgnoreCase);
  333. Htmlstring = Regex.Replace(Htmlstring, @"&(quot|#34);", "\"", RegexOptions.IgnoreCase);
  334. Htmlstring = Regex.Replace(Htmlstring, @"&(amp|#38);", "&", RegexOptions.IgnoreCase);
  335. Htmlstring = Regex.Replace(Htmlstring, @"&(lt|#60);", "<", RegexOptions.IgnoreCase);
  336. Htmlstring = Regex.Replace(Htmlstring, @"&(gt|#62);", ">", RegexOptions.IgnoreCase);
  337. Htmlstring = Regex.Replace(Htmlstring, @"&(nbsp|#160);", " ", RegexOptions.IgnoreCase);
  338. Htmlstring = Regex.Replace(Htmlstring, @"&(iexcl|#161);", "\xa1", RegexOptions.IgnoreCase);
  339. Htmlstring = Regex.Replace(Htmlstring, @"&(cent|#162);", "\xa2", RegexOptions.IgnoreCase);
  340. Htmlstring = Regex.Replace(Htmlstring, @"&(pound|#163);", "\xa3", RegexOptions.IgnoreCase);
  341. Htmlstring = Regex.Replace(Htmlstring, @"&(copy|#169);", "\xa9", RegexOptions.IgnoreCase);
  342. Htmlstring = Regex.Replace(Htmlstring, @"&#(\d+);", "", RegexOptions.IgnoreCase);
  343. Htmlstring = Regex.Replace(Htmlstring, @"&hellip;", "", RegexOptions.IgnoreCase);
  344. Htmlstring = Regex.Replace(Htmlstring, @"&mdash;", "", RegexOptions.IgnoreCase);
  345. Htmlstring = Regex.Replace(Htmlstring, @"&ldquo;", "", RegexOptions.IgnoreCase);
  346. Htmlstring.Replace("<", "");
  347. Htmlstring = Regex.Replace(Htmlstring, @"&rdquo;", "", RegexOptions.IgnoreCase);
  348. Htmlstring.Replace(">", "");
  349. Htmlstring.Replace("\r\n", "");
  350. Htmlstring = HtmlEncode(Htmlstring).Trim();
  351. return Htmlstring;
  352. }
  353. #endregion
  354. #region 格式化文本(防止SQL注入)
  355. /// <summary>
  356. /// 格式化文本(防止SQL注入)
  357. /// </summary>
  358. /// <param name="html">html页面数据</param>
  359. /// <returns></returns>
  360. public static string Formatstr(string html)
  361. {
  362. System.Text.RegularExpressions.Regex regex1 = new System.Text.RegularExpressions.Regex(@"<script[\s\S]+</script *>", System.Text.RegularExpressions.RegexOptions.IgnoreCase);
  363. System.Text.RegularExpressions.Regex regex2 = new System.Text.RegularExpressions.Regex(@" href *= *[\s\S]*script *:", System.Text.RegularExpressions.RegexOptions.IgnoreCase);
  364. System.Text.RegularExpressions.Regex regex3 = new System.Text.RegularExpressions.Regex(@" on[\s\S]*=", System.Text.RegularExpressions.RegexOptions.IgnoreCase);
  365. System.Text.RegularExpressions.Regex regex4 = new System.Text.RegularExpressions.Regex(@"<iframe[\s\S]+</iframe *>", System.Text.RegularExpressions.RegexOptions.IgnoreCase);
  366. System.Text.RegularExpressions.Regex regex5 = new System.Text.RegularExpressions.Regex(@"<frameset[\s\S]+</frameset *>", System.Text.RegularExpressions.RegexOptions.IgnoreCase);
  367. System.Text.RegularExpressions.Regex regex10 = new System.Text.RegularExpressions.Regex(@"select", System.Text.RegularExpressions.RegexOptions.IgnoreCase);
  368. System.Text.RegularExpressions.Regex regex11 = new System.Text.RegularExpressions.Regex(@"update", System.Text.RegularExpressions.RegexOptions.IgnoreCase);
  369. System.Text.RegularExpressions.Regex regex12 = new System.Text.RegularExpressions.Regex(@"delete", System.Text.RegularExpressions.RegexOptions.IgnoreCase);
  370. html = regex1.Replace(html, ""); //过滤<script></script>标记
  371. html = regex2.Replace(html, ""); //过滤href=javascript: (<A>) 属性
  372. html = regex3.Replace(html, " _disibledevent="); //过滤其它控件的on...事件
  373. html = regex4.Replace(html, ""); //过滤iframe
  374. html = regex10.Replace(html, "s_elect");
  375. html = regex11.Replace(html, "u_pudate");
  376. html = regex12.Replace(html, "d_elete");
  377. html = html.Replace("'", "’");
  378. html = html.Replace("&nbsp;", " ");
  379. return html;
  380. }
  381. #endregion
  382. #region 获取mac地址
  383. /// <summary>
  384. /// 返回描述本地计算机上的网络接口的对象(网络接口也称为网络适配器)。
  385. /// </summary>
  386. /// <returns></returns>
  387. public static NetworkInterface[] NetCardInfo()
  388. {
  389. return NetworkInterface.GetAllNetworkInterfaces();
  390. }
  391. ///<summary>
  392. /// 通过NetworkInterface读取网卡Mac
  393. ///</summary>
  394. ///<returns></returns>
  395. public static List<string> GetMacByNetworkInterface()
  396. {
  397. List<string> macs = new List<string>();
  398. NetworkInterface[] interfaces = NetworkInterface.GetAllNetworkInterfaces();
  399. foreach (NetworkInterface ni in interfaces)
  400. {
  401. macs.Add(ni.GetPhysicalAddress().ToString());
  402. }
  403. return macs;
  404. }
  405. #endregion
  406. #region 获取皮肤主题
  407. /// <summary>
  408. /// 获取用户当前UI主题皮肤类
  409. /// </summary>
  410. /// <returns></returns>
  411. public static string GetUITheme()
  412. {
  413. return "lr-uitheme-top";
  414. //string res = "lr-uitheme-default";
  415. //try
  416. //{
  417. // string learn_UItheme = WebHelper.GetCookie("Learn_ADMS_V6.1_UItheme");
  418. // switch (learn_UItheme)
  419. // {
  420. // case "1":
  421. // res = "lr-uitheme-default"; // 经典版本
  422. // break;
  423. // case "2":
  424. // res = "lr-uitheme-accordion"; // 手风琴版本
  425. // break;
  426. // case "3":
  427. // res = "lr-uitheme-windos"; // Windos版本
  428. // break;
  429. // case "4":
  430. // res = "lr-uitheme-top"; // 顶部菜单版本
  431. // break;
  432. // default:
  433. // res = "lr-uitheme-default"; // 经典版本
  434. // break;
  435. // }
  436. //}
  437. //catch (Exception)
  438. //{
  439. //}
  440. }
  441. #endregion
  442. #region 添加/获取上下文信息
  443. /// <summary>
  444. /// 添加链接上下文信息
  445. /// </summary>
  446. /// <param name="name">名称</param>
  447. /// <param name="obj">数据</param>
  448. public static void AddHttpItems(string name, object data)
  449. {
  450. HttpContext.Items.Add(name, data);
  451. }
  452. /// <summary>
  453. /// 更新链接上下文信息
  454. /// </summary>
  455. /// <param name="name">名称</param>
  456. /// <param name="data">数据</param>
  457. public static void UpdateHttpItem(string name, object data)
  458. {
  459. HttpContext.Items[name] = data;
  460. }
  461. /// <summary>
  462. /// 获取链接上下文信息
  463. /// </summary>
  464. /// <param name="name">名称</param>
  465. /// <returns></returns>
  466. public static object GetHttpItems(string name)
  467. {
  468. if (HttpContext == null)
  469. {
  470. return null;
  471. }
  472. return HttpContext.Items[name];
  473. }
  474. #endregion
  475. /// <summary>
  476. /// 获取上下文值
  477. /// </summary>
  478. /// <param name="key">键</param>
  479. /// <returns></returns>
  480. public static object GetItem(string key)
  481. {
  482. HttpContext.Items.TryGetValue(key, out object res);
  483. return res;
  484. }
  485. /// <summary>
  486. /// 设置上下文值
  487. /// </summary>
  488. /// <param name="key">键</param>
  489. /// <param name="value">值</param>
  490. public static void SetItem(string key, string value)
  491. {
  492. if (HttpContext.Items.ContainsKey(key))
  493. {
  494. HttpContext.Items.Remove(key);
  495. }
  496. HttpContext.Items.Add(key, value);
  497. }
  498. /// <summary>
  499. /// 移除上下文值
  500. /// </summary>
  501. /// <param name="key"></param>
  502. public static void RemoveItem(string key)
  503. {
  504. if (HttpContext.Items.ContainsKey(key))
  505. {
  506. HttpContext.Items.Remove(key);
  507. }
  508. }
  509. }
  510. }