对于想了解JSP清除页面缓存常用方法小结的读者,本文将是一篇不可错过的文章,我们将详细介绍jsp怎么清除缓存,并且为您提供关于asp.net清除页面缓存,防止页面回退重复提交数据及防止同一用户同时登录
对于想了解JSP清除页面缓存常用方法小结的读者,本文将是一篇不可错过的文章,我们将详细介绍jsp怎么清除缓存,并且为您提供关于asp.net清除页面缓存,防止页面回退重复提交数据及防止同一用户同时登录、ASP.NET页面缓存常见的4种方式、CI框架常用方法小结、CSS 清除浮动常用方法小结的有价值信息。
本文目录一览:- JSP清除页面缓存常用方法小结(jsp怎么清除缓存)
- asp.net清除页面缓存,防止页面回退重复提交数据及防止同一用户同时登录
- ASP.NET页面缓存常见的4种方式
- CI框架常用方法小结
- CSS 清除浮动常用方法小结
JSP清除页面缓存常用方法小结(jsp怎么清除缓存)
本文实例总结了JSP清除页面缓存常用方法。分享给大家供大家参考,具体如下:
一、清除页面缓存
在jsp页里
<%response.setHeader("Pragma","No-cache"); response.setHeader("Cache-Control","no-cache"); response.setDateHeader("Expires",0); response.flushBuffer();%>
在html页里:
<Meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <Meta HTTP-EQUIV="Pragma" CONTENT="no-cache"> <Meta HTTP-EQUIV="Cache-Control" CONTENT="no-cache"> <Meta HTTP-EQUIV="Expires" CONTENT="0">
二、清除cookie
<% Cookie killMyCookie = new Cookie("mycookie",null); killMyCookie.setMaxAge(0); killMyCookie.setPath("/"); response.addCookie(killMyCookie); %>
三、清除session
清除session方法
<%@ page language="java" %> <% session.invalidate(); %>
在页面关闭时清除session,需要捕获windows.onclose事件,再调用清除session方法
补充:如何使用 JavaScript 代码清除缓存?
如果在服务器级不能生成随机数,您可以使用 JavaScript 代码在客户端(浏览器)级生成一个字符串。以下示例图解说明如何使用标准图像代码或 Iframe/JavaScript 代码执行缓存清除。
这些仅为示例。如果要使用该代码,请为特定 HTML 代码对示例作相应调整。您必须将实际代码粘贴到这些示例中的相应位置。
标准图像代码示例:
<SCRIPT LANGUAGE="JavaScript"> <!== hide from non-JavaScript browsers var axel = Math.random() + ""; var num = axel * 1000000000000000000; document.writeln('<A HREF="http://ad.doubleclick.net/jump/N409.somesite/B470;sz=468x60;ord='+ num +'?"><IMG SRC="http://ad.doubleclick.net/ad/N409.somesite/B470;sz=468x60;ord='+ num +'?" BORDER=0 WIDTH=468 HEIGHT=60 ALT="Click Here!"> Click Here!</A>'); // end hide from browsers ==> </SCRIPT> <NOSCRIPT> <A HREF="http://ad.doubleclick.net/jump/N409.somesite/B470;sz=468x60;ord=[timestamp]?"> <IMG SRC="http://ad.doubleclick.net/ad/N409.somesite/B470;sz=468x60;ord=[timestamp]?" BORDER=0 WIDTH=468 HEIGHT=60 ALT="Click Here!"> Click Here!</A> </NOSCRIPT>
Iframe/JavaScript 代码示例:
<SCRIPT LANGUAGE="JavaScript"> <!== hide from non-JavaScript browsers var axel = Math.random() + ""; var num = axel * 1000000000000000000; document.writeln('<IFRAME SRC="http://ad.doubleclick.net/adi/N409.somesite/B470;sz=468x60;ord='+ num +'?" WIDTH=470 HEIGHT=62 MARGINWIDTH=0 MARGINHEIGHT=0HSPACE=0 VSPACE=0 FRAMEBORDER=0 SCROLLING=no BORDERCOLOR="#000000">'); document.writeln('<SCR'+'IPT language="JavaScript1.1" SRC="http://ad.doubleclick.net/adj/N409.somesite/B470;abr=!ie;sz=468x60;ord='+ num +'?"></SCR'+'IPT></IFRAME>'); // end hide from browsers ==> </script> <noscript> <A HREF="http://ad.doubleclick.net/jump/N409.somesite/B470;abr=!ie4;abr=!ie5;sz=468x60;ord=?"> <IMG SRC="http://ad.doubleclick.net/ad/N409.somesite/B470;abr=!ie4;abr=!ie5;sz=468x60;ord=?" BORDER=0 WIDTH=468 HEIGHT=60 ALT="Click Here!"> Click Here!</A> <noscript>
希望本文所述对大家JSP程序设计有所帮助。
asp.net清除页面缓存,防止页面回退重复提交数据及防止同一用户同时登录
//清除页面缓存,防止页面回退重复提交数据 在页面里做以下设置就可以使页面的缓存失效,每次都需要获取新页面。
Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache);
/*
要防止同一用户同时登陆,首页应该记录在线用户的信息(这里与用户名为例),然后判断正在登陆的用户里面是否已存在。
在这里使用一个cache存放已经登陆的用户名,但是还有一个问题就是要知道用户是什么时候离开系统的呢?这就要定期清除cache中的内容了,也就是设置一个cache的时间。这个时间可以跟用户的session值联系起来,刚好当用户session值失效的时候该用户在cache里面的信息也会被清空.
这样就达到了防止同时登陆的效果,具体代码如下,放在登陆成功的地方:
*/
string key = TextBox1.Text; //用户名文本框设为cache关键字
string uer = Convert.ToString(Cache[key]); //读取cache中用户相应的值
//判断cache中是否有用户的信息,如果没有相关的值,说明用户未登陆
if (uer == null || uer == String.Empty)
{
//定义cache过期时间
TimeSpan SessTimeout = new TimeSpan(0, 0, System.Web.HttpContext.Current.Session.Timeout, 0, 0);
//第一次登陆的时候插入一个用户相关的cache值,
HttpContext.Current.Cache.Insert(key, key, null, DateTime.MaxValue, SessTimeout, System.Web.Caching.CacheItemPriority.NotRemovable, null);
Session["ADMINID"] = TextBox1.Text;
Response.Redirect("main.aspx");
}
else
{
//重复登陆
Response.Write("<script>alert(''您的账号已经登陆!'');window.location=''login.aspx'';</script>");
}
ASP.NET页面缓存常见的4种方式
本文为大家分享了4种常见的ASP.NET页面缓存方式,供大家参考,具体内容如下
1、分布式缓存Memcached,教程下载
2、内存缓存,此占用服务器资源
#region 内存缓存 public class MemoryCache { #region 写 /// <summary> /// 向内存写入数据缓存 /// </summary> /// <remarks>TOMMYHU2011-7-28 10:25创建</remarks> /// <param name="cachekey">缓存标识关键字</param> /// <param name="cacheresult">需要存放的数据</param> /// <param name="cachetime">单位秒</param> public static void InertMemoryCache(string cachekey, object cacheresult, int cachetime) { if (cacheresult != null) { System.Web.HttpRuntime.Cache.Insert(cachekey, cacheresult, null , System.Web.Caching.Cache.NoAbsoluteExpiration, TimeSpan.FromSeconds(cachetime)); } } #endregion #region 读 /// <summary> /// 根据缓存标识读取内存缓存信息 /// </summary> /// <remarks>TOMMYHU2011-7-28 10:25创建</remarks> /// <param name="cachekey">缓存标识关键字</param> /// <returns>内存缓存数据</returns> public static object ReadMemoryCache(string cachekey) { object obj = System.Web.HttpRuntime.Cache.Get(cachekey); if (obj != null) { return obj; } return null; } #endregion } #endregion
3、XML缓存,这种最为常见
#region xml缓存 public static class XmlCache { private static string m_CacheFolderName = null; #region 获取/生成缓存文件方法(无cmdParams) /// <summary> /// 获取/生成缓存文件方法(DataTable) /// </summary> /// <param name="SQL">用于将Sql转化为MD5字符串</param> /// <param name="CacheFilePath">存放Xml文件的相对路径(根目录已预置)</param> /// <param name="CacheTime">缓存时间</param> /// <param name="DataUsed">使用的数据库的链接字符串</param> /// <returns></returns> public static DataTable CacheFileByDataTable(string SQL, string CacheFilePath, int CacheTime) { SQLHelper.SQLHelper QuerySql = new SQLHelper.SQLHelper(); if (CacheFilePath != string.Empty && CacheFilePath.StartsWith("/")) { CacheFilePath = CacheFilePath.Remove(0, 1); } string SqlMd5 = SQL;//用于将Sql转化为MD5字符串 string StrSqlByMd5 = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(SqlMd5, "MD5");//生成的Md5文件名 string MyCacheFilePath = ""; if (CacheTime >= 10000)//如果大于20天的话系统默认为持久 { MyCacheFilePath = XmlCache.CacheFolderNameP + CacheFilePath;//用于存放Xml文件的相对路径 } else { MyCacheFilePath = XmlCache.CacheFolderName + CacheFilePath;//用于存放Xml文件的相对路径 } int MyCacheTime = CacheTime;//缓存时间(分) DataTable dt = new DataTable();//存放数据记录的DataTable DataTable CacheDt = new DataTable();//获取缓存数据记录的DataTable //尝试获取缓存数据记录 try { CacheDt = DataTableCache.GetDTCache(MyCacheTime, MyCacheFilePath, StrSqlByMd5); } catch { CacheDt = null; } if (CacheDt != null)//获取到缓存的XML文件 { dt = CacheDt; } else//未获取到缓存的XML文件 { //生成DataTable(如果用Query查询请用Query.ProcessSql方法) //dt = Query.ProcessSql(SqlMd5, DataUsed); dt = QuerySql.retDT(SQL); //将DataTable存为XML文件 try { if (dt.DataSet != null) { dt.DataSet.Tables.Remove(dt); } DataTableCache.SetDTCache(MyCacheFilePath, StrSqlByMd5, dt); } catch (Exception ex) { //Log.GetComLogger().Error("将DataTable存为XML文件出错:" + ex.Message); } } return dt; } /// <summary> /// 获取/生成缓存文件方法(DataSet) Add By WJ 08-10-23 /// </summary> /// <param name="SQL">用于将Sql转化为MD5字符串</param> /// <param name="CacheFilePath">存放Xml文件的相对路径(根目录已预置)</param> /// <param name="CacheTime">缓存时间</param> /// <param name="DBName">使用的数据库的链接字符串</param> /// <returns></returns> public static DataSet CacheFileByDataSet(string SQL, string CacheFilePath, int CacheTime) { SQLHelper.SQLHelper QuerySql = new SQLHelper.SQLHelper(); if (CacheFilePath != string.Empty && CacheFilePath.StartsWith("/")) { CacheFilePath = CacheFilePath.Remove(0, 1); } string SqlMd5 = SQL;//用于将Sql转化为MD5字符串 string StrSqlByMd5 = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(SqlMd5, "MD5");//生成的Md5文件名 string MyCacheFilePath = XmlCache.CacheFolderName + CacheFilePath;//用于存放Xml文件的相对路径 int MyCacheTime = CacheTime;//缓存时间(分) DataSet ds = new DataSet();//存放数据记录的DataSet DataSet CacheDs = new DataSet();//获取缓存数据记录的DataSet //尝试获取缓存数据记录 try { CacheDs = DataTableCache.GetDSCache(MyCacheTime, MyCacheFilePath, StrSqlByMd5); } catch { CacheDs = null; } if (CacheDs != null)//获取到缓存的XML文件 { ds = CacheDs; } else//未获取到缓存的XML文件 { //生成DataSet //ds = Query.ProcessMultiSql(SqlMd5, DBName); ds = QuerySql.retDS(SQL); //将DataSet存为XML文件 try { DataTableCache.SetDSCache(MyCacheFilePath, StrSqlByMd5, ds); } catch { } } return ds; } #endregion #region 获取/生成缓存文件方法(有cmdParams) /// <summary> /// 获取/生成缓存文件方法(DataTable) /// </summary> /// <param name="SQL">用于将Sql转化为MD5字符串</param> /// <param name="CacheFilePath">存放Xml文件的相对路径(根目录已预置)</param> /// <param name="CacheTime">缓存时间</param> /// <param name="DataUsed">使用的数据库的链接字符串</param> /// <param name="cmdParams">以数组形式提供SqlCommand命令中用到的参数列表</param> /// <returns></returns> public static DataTable CacheFileByDataTable(string SQL, string CacheFilePath, int CacheTime, string DBConstr, params SqlParameter[] cmdParams) { SQLHelper.SQLHelper QuerySql = new SQLHelper.SQLHelper(); if (CacheFilePath != string.Empty && CacheFilePath.StartsWith("/")) { CacheFilePath = CacheFilePath.Remove(0, 1); } string SqlMd5 = SQL;//用于将Sql转化为MD5字符串 string sqlmd5params = SQL; if (cmdParams != null) { for (int i = 0; i < cmdParams.Length; i++) { if (cmdParams[i].Value != null) sqlmd5params += cmdParams[i].Value.ToString(); } } string StrSqlByMd5 = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sqlmd5params, "MD5");//生成的Md5文件名 string MyCacheFilePath = ""; if (CacheTime >= 10000)//如果大于20天的话系统默认为持久 { MyCacheFilePath = XmlCache.CacheFolderNameP + CacheFilePath;//用于存放Xml文件的相对路径 } else { MyCacheFilePath = XmlCache.CacheFolderName + CacheFilePath;//用于存放Xml文件的相对路径 } int MyCacheTime = CacheTime;//缓存时间(分) DataTable dt = new DataTable();//存放数据记录的DataTable DataTable CacheDt = new DataTable();//获取缓存数据记录的DataTable //尝试获取缓存数据记录 CacheDt = DataTableCache.GetDTCache(MyCacheTime, MyCacheFilePath, StrSqlByMd5); if (CacheDt != null)//获取到缓存的XML文件 { dt = CacheDt; } else//未获取到缓存的XML文件 { //生成DataTable(如果用Query查询请用Query.ProcessSql方法) //dt = Query.ProcessSql(SqlMd5, DataUsed); dt = QuerySql.retDT(SqlMd5); DataTable dt1 = new DataTable(); if (dt != null) { dt1 = dt.Copy(); } //将DataTable存为XML文件 DataTableCache.SetDTCache(MyCacheFilePath, StrSqlByMd5, dt1); } return dt; } /// <summary> /// 获取/生成缓存文件方法(DataSet) Add By wjf /// </summary> /// <param name="SQL">用于将Sql转化为MD5字符串</param> /// <param name="CacheFilePath">存放Xml文件的相对路径(根目录已预置)</param> /// <param name="CacheTime">缓存时间</param> /// <param name="DBName">使用的数据库的链接字符串</param> /// <param name="cmdParams">以数组形式提供SqlCommand命令中用到的参数列表</param> /// <returns></returns> public static DataSet CacheFileByDataSet(string SQL, string CacheFilePath, int CacheTime, string DBConstr, params SqlParameter[] cmdParams) { SQLHelper.SQLHelper QuerySql = new SQLHelper.SQLHelper(); string SqlMd5 = SQL;//用于将Sql转化为MD5字符串 string sqlmd5params = SQL; if (cmdParams != null) { for (int i = 0; i < cmdParams.Length; i++) { if (cmdParams[i].Value != null) sqlmd5params += cmdParams[i].Value.ToString(); } } string StrSqlByMd5 = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sqlmd5params, "MD5");//生成的Md5文件名 string MyCacheFilePath = XmlCache.CacheFolderName + CacheFilePath;//用于存放Xml文件的相对路径 int MyCacheTime = CacheTime;//缓存时间(分) DataSet ds = new DataSet();//存放数据记录的DataSet DataSet CacheDs = new DataSet();//获取缓存数据记录的DataSet //尝试获取缓存数据记录 CacheDs = DataTableCache.GetDSCache(MyCacheTime, MyCacheFilePath, StrSqlByMd5); if (CacheDs != null)//获取到缓存的XML文件 { ds = CacheDs; } else//未获取到缓存的XML文件 { //生成DataSet //ds = Query.ProcessMultiSql(SqlMd5, DBName); ds = QuerySql.retDS(SqlMd5); DataSet ds1 = new DataSet(); if (ds != null) { ds1 = ds.Copy(); } //将DataSet存为XML文件 DataTableCache.SetDSCache(MyCacheFilePath, StrSqlByMd5, ds1); } return ds; } #endregion #region 非持久保持 /// <summary> /// 非持久保持 /// </summary> public static string CacheFolderName { get { if (m_CacheFolderName == null)//如果Global.asax中未定义路径 { m_CacheFolderName = System.Configuration.ConfigurationManager.AppSettings.GetValues("CachePathRoot")[0]; if (m_CacheFolderName == null)//如果Web.Config中未定义路径 { return "/CacheData/" + DateTime.Now.ToString("yyyyMMdd") + "/"; } else { return m_CacheFolderName + DateTime.Now.ToString("yyyyMMdd") + "/"; } } else { return m_CacheFolderName + DateTime.Now.ToString("yyyyMMdd") + "/"; } } set { m_CacheFolderName = value; } } #endregion #region 持久保存(例如存放MapBar缓存的数据或需要3个月以上更新的数据等) /// <summary> /// 持久保存(例如存放MapBar缓存的数据或需要3个月以上更新的数据等) /// </summary> public static string CacheFolderNameP { get { if (m_CacheFolderName == null)//如果Global.asax中未定义路径 { m_CacheFolderName = System.Configuration.ConfigurationManager.AppSettings.GetValues("CachePathRoot")[0]; if (m_CacheFolderName == null)//如果Web.Config中未定义路径 { return "/CacheData/"; } else { return m_CacheFolderName; } } else { return m_CacheFolderName; } } set { m_CacheFolderName = value; } } #endregion } #endregion
4、DATATABLE缓存
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
- ASP.NET Core缓存静态资源示例详解
- 详解ASP.NET Core 中间件之压缩、缓存
- Asp.Net中MVC缓存详解
- asp.net性能优化之使用Redis缓存(入门)
- ASP.NET下使用xml反序列化、缓存依赖实现个性化配置文件的实时生效
- ASP.NET MVC中使用jQuery时的浏览器缓存问题详解
- 详解Asp.Net Core 2.1+的视图缓存(响应缓存)
CI框架常用方法小结
本文实例讲述了CI框架常用方法。分享给大家供大家参考,具体如下:
一、在模板文件中加载css、js文件:
<link rel="stylesheet" type="text/css" href="<?=base_url(''css/style.css'')?>" /> <link rel="stylesheet" type="text/css" href="<?=base_url(''js/kindeditor/themes/default/default.css'')?>" /> <link rel="shortcut icon" href="<?=base_url(''images/favicon.ico'')?>" /> <script type="text/javascript" src="<?=base_url(''js/jquery.min.js'')?>"></script> <script type="text/javascript" src="<?=base_url(''js/admin.public.js'')?>"></script> <script type="text/javascript" src="<?=base_url(''js/jquery.artDialog.js?skin=default'')?>"></script> <script type="text/javascript" src="<?=base_url(''js/datejs/WdatePicker.js'')?>"></script> <script type="text/javascript" charset="utf-8" src="<?=base_url(''js/kindeditor/kindeditor-min.js'')?>"></script>
二、在模板文件中加载子模板文件:
<?php $this->load->view(''admin_head.php'');?> <?php $this->load->view(''admin_foot.php'');?>
三、模板文件中可以直接使用函数调用数据
四、模型中调用CI对象
$CI =& get_instance(); $CI->load->model(''Data_model'');
更多关于CodeIgniter相关内容感兴趣的读者可查看本站专题:《codeigniter入门教程》、《CI(CodeIgniter)框架进阶教程》、《php优秀开发框架总结》、《ThinkPHP入门教程》、《ThinkPHP常用方法总结》、《Zend FrameWork框架入门教程》、《php面向对象程序设计入门教程》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家基于CodeIgniter框架的PHP程序设计有所帮助。
- CI框架源码解读之利用Hook.php文件完成功能扩展的方法
- CodeIgniter扩展核心类实例详解
- CI框架整合smarty步骤详解
- CI框架的安全性分析
- load->library()用法分析" target="_blank">CI框架中$this->load->library()用法分析
- CI框架数据库查询之join用法分析
- CI框架简单邮件发送类实例
- CI框架扩展系统核心类的方法分析
CSS 清除浮动常用方法小结
使用 div+css 布局的好处不用多说,经常性地会使用到 float,那么清除浮动就是必须要做的,而且随时性地对父级元素清除浮动的做法也被认为是书写 CSS 的良好习惯之一。
常用的清除浮动的方法有以下三种。
此为未清除浮动源代码,运行代码无法查看到父级元素浅黄色背景。
<style type="text/css">
<!--
*{margin:0;padding:0;}
body{font:36px bold; color:#F00; text-align:center;}
#layout{background:#FF9;}
#left{float:left;width:20%;height:200px;background:#DDD;line-height:200px;}
#right{float:right;width:30%;height:80px;background:#DDD;line-height:80px;}
-->
</style>
<div id="layout">
<div id="left">Left</div>
<div id="right">Right</div>
</div>
1、使用空标签清除浮动。我用了很久的一种方法,空标签可以是 div 标签,也可以是 P 标签。我习惯用 <P>,够简短,也有很多人用 < hr>,只是需要另外为其清除边框,但理论上可以是任何标签。这种方式是在需要清除浮动的父级元素内部的所有浮动元素后添加这样一个标签清楚浮动,并为其定义 CSS 代码:clear:both。此方法的弊端在于增加了无意义的结构元素。
<style type="text/css">
<!--
*{margin:0;padding:0;}
body{font:36px bold; color:#F00; text-align:center;}
#layout{background:#FF9;}
#left{float:left;width:20%;height:200px;background:#DDD;line-height:200px;}
#right{float:right;width:30%;height:80px;background:#DDD;line-height:80px;}
.clr{clear:both;}
-->
</style>
<div id="layout">
<div id="left">Left</div>
<div id="right">Right</div>
<p></p>
</div>
2、使用 overflow 属性。此方法有效地解决了通过空标签元素清除浮动而不得不增加无意代码的弊端。使用该方法是只需在需要清除浮动的元素中定义 CSS 属性:overflow:auto,即可!"zoom:1" 用于兼容 IE6。
<style type="text/css">
<!--
*{margin:0;padding:0;}
body{font:36px bold; color:#F00; text-align:center;}
#layout{background:#FF9;overflow:auto;zoom:1;}
#left{float:left;width:20%;height:200px;background:#DDD;line-height:200px;}
#right{float:right;width:30%;height:80px;background:#DDD;line-height:80px;}
-->
</style>
<div id="layout">
<div id="left">Left</div>
<div id="right">Right</div>
</div>
3、使用 after 伪对象清楚浮动。该方法只适用于非 IE 浏览器。具体写法可参照以下示例。使用中需注意以下几点。一、该方法中必须为需要清除浮动元素的伪对象中设置 height:0,否则该元素会比实际高出若干像素;二、content 属性是必须的,但其值可以为空,蓝色理想讨论该方法的时候 content 属性的值设为 ".",但我发现为空亦是可以的。
<style type="text/css">
<!--
*{margin:0;padding:0;}
body{font:36px bold; color:#F00; text-align:center;}
#layout{background:#FF9;}
#layout:after{display:block;clear:both;content:"";visibility:hidden;height:0;}
#left{float:left;width:20%;height:200px;background:#DDD;line-height:200px;}
#right{float:right;width:30%;height:80px;background:#DDD;line-height:80px;}
-->
</style>
<div id="layout">
<div id="left">Left</div>
<div id="right">Right</div>
</div>
此三种方法皆有一定弊端,使用时应择优选择,比较之下第二种方法更为可取。以上方法,并非原创,皆来源于网络,在此小作整理,原作者保留所有权利。
关于JSP清除页面缓存常用方法小结和jsp怎么清除缓存的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于asp.net清除页面缓存,防止页面回退重复提交数据及防止同一用户同时登录、ASP.NET页面缓存常见的4种方式、CI框架常用方法小结、CSS 清除浮动常用方法小结的相关信息,请在本站寻找。
本文标签: