码迷,mamicode.com
首页 > Web开发 > 详细

数往知来 ASP.NET Cookie Session Url <二十九>

时间:2015-09-10 21:04:05      阅读:301      评论:0      收藏:0      [点我收藏+]

标签:

ViewState_Cookie

一、Request的几个成员

--》Request.UrlReferrer():请求的来源,就是客户端上一次请求的url地址,防止盗链

--》Request.UrlHostAddress;获取浏览器端的IP地址,通过Socket.RemoveEndPoint  获得的客户端IP地址

--》Request.MapPath();   跟context.ServerMapPath()一样

二、Response的成员

--》Respose.Buffer

缓冲区

--》Response.Flush();

会将缓冲区的内容立即输出

-->response.Clear();

清空缓冲区

--》Response.ContextType

响应报文的输出类型

四、Server对象

Server.MapPath();去的文件的物理路径

Redirect、Transfer、Execute  几个方法之间的区别

--》redirect():重定向,在响应报文中服务端会向浏览器发送一个302响应码,还有一个location,这个location是要重定向到的地址告诉浏览器要重合定向到哪个页面,redirect可以重定向到其他外部的页面也可以重定向到内部网站并且重定向之后url地址栏的地址也会改变,被请求的页面也不会显示,redirect经历的是一个服务器通知浏览器“请重新访问url这个新网址”,然后浏览器接到通知重新访问这个新的url网址这样的过程

--》Transfer:Transfer方法也是重定向到其他的页面,被请求的当前页面也不会显示,但是,Transfer它只能重定向到内部页面的就是和当前页面在同一个文件下面的页面,它是由内部接管的浏览器并不知道它是服务端内部接管的,所以执行Transfer()方法之后跳转到新的页面之后地址栏的url地址不会发生改变,还是客户端请求的那个页面url

--》Execute:从第一个页面直接调用第二个页面,执行完第二个页面之后再跳转回第一个页面执行,最后响应浏览器客户端

--》Server.htmlEncode();取消html标签的解析

2)HttpContext.Current....

在一些类中有时我们获取不到Server,那么此时我们就可以通过HttpContext.Current....获取到

这个表示获取当前类的HttpContext的对象

五、HTTP的无状态性

六、ASP.NET中状态(信息)的保持方案

客户端

--》Hidden:隐藏域

--》ViewState:。net特有的,

,注意,如果在页面中使用ViewState的话必须在form表单中加上 runat=‘server‘,因为它是状态保持机制的

它是页面级的,就是说在整个页面类里定义,可以在这个页面里的任何一个地方可以使用它,就相当于一个全局变量一样,它是基于隐藏域的,当服务端将页面返回给浏览器时,会讲名称为num的ViewState的值保存到一个名称叫__VIEWSTATE的一个隐藏域里,当点击SubMit按钮提交表单时就会把名称叫VIEWSTATE隐藏域的值提交到服务端,给名称叫num的ViewState

在页面生命周期的SaveState事件中调用了SaveAllState方法

服务器端

七、Cookie

---》创建Cookie

--》设置Cookie的过期时间,如果不设置它的过期时间,Cookie里面的数据是会保存的客户端的内存里的,如果设置了Cookie就会以文件的形式保存在客户端的硬盘里

删除Cookie;通过服务端代码删除Cookie,把过期时间设置一下就可以了

session_Ajax

一、sesstion

在服务端有一个Sesstion池,专门用来存储Sesstion(是服务端的),那么为了对Sesstion进行区分,给每个存储单元编号,然后将编号返回给浏览器,下次浏览器访问的时候带着这个编号,然后根据该编号从服务端的Sesstion池中取出对应的session并将应用赋值给请求上下文HttpContext里的session属性

--》session的运行原理,用一个登陆案例说明

有一个登陆页面,和一个管理页面,要求是用户必须要通过登陆页面登陆成功之后才允许访问管理业面,

当用户在登陆页面输入用户名和密码向服务端发送请求,我们可以再在服务端判断用户登陆成功之后创建一个session对象,每个客户端都会有一个队员的session对象,这个session对象是怎么创建的呢,首先会在服务端的session池里开辟一块空间,

-->session的创建

Session["name"] = name;

--》在使用之前先进行非空判断

if (Session["validate"]!=null)

        {

            //校验验证码

            if (validate==Session["validate"].ToString ())//sesion的取值,

         }

--》一般处理程序使用session

首先要继承一个接口,在请求管道的第9至11个事件之间,会有一个事件去尝试把这个页面对象转换成一个IRequiresSessionState接口对象,如果转换不成功session就不会被加载,

如果转换成功,就会从请求报文里面取出sessionId,根据这个sessionId到服务端的session池里去找到对应的session对象,把这个对象的引用赋值给HttpContext里的session属性,

那么在页面对象调用pr方法的时候就可以通过page类的session属性访问到HttpCtext里的sessionle ,如果不继承这个借口就没办法使用session,会报一个未设置对象的这么一个错

System.Web.SessionState.IRequiresSessionState

   HttpContext.Current.Session["validate"] = res;

==================================================================================================================================================================

二、Ajax

//Ajax    当文本框失去焦点后

            $(#name).blur(function () {

                //创建一个httprequestxhr

                var xhr = createXhr();

                xhr.open(get, UserValidate.ashx?name= + $(this).val() + ‘‘, true); //以get方式,向服务端UserValidate.ashx发送请求,true:表示异步

  //当get请求的时候浏览器会有缓存,清除浏览器缓存

                xhr.setRequestHeader("If-Modified-Since","0");

                //当服务端返回数据触发onresponsexhr

                xhr.onreadystatechange = function () {

                    //判断是否完全接受服务端返回的数据

                    if (xhr.readyState == 4) {

                        //判断服务端返回的数据有没有问题

                        if (xhr.status == 200) {

                            //接受服务端返回的文本数据

                            if (xhr.responseText === "1") {

                                $(#sp1).text().css(color,green);

                            } else {

                                $(#sp1).text(x  用户名已存在!).css(color,red);

                            }

                        }

                    }

                }

                //发送,如果是以get发送请求send里面写null

                xhr.send(null);

            });

--》post请求

var xhr = createXhr();

            xhr.open("post", "LobinTable.ashx?type=i", true);

            xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

            xhr.onreadystatechange = function () {

                if (xhr.readyState == 4) {

                    if (xhr.status == 200) {

                        var json = xhr.responseText;

                        switch (json) {

                            case "1":

                                alert(添加成功!);

                                var tbl = document.getElementById(tblShow);

                                for (var i = 1; i < tbl.rows.length; i++) {

                                    tbl.deleteRow(i);

                                }

                                document.getElementById(dv1).setAttribute(style, display:none);

                                document.getElementById(txtName).value = "";

                                document.getElementById(txtPwd).value = "";

                                ShowList();

                                break;

                            case "0":

                                alert(添加失败!);

                                break;

                            default:

                                alert(出现错误!);

                                break;

                        }

                    }

                }

            }

            xhr.send("txtName=" + txtName + "&txtPwd=" + txtPwd + "");

-->Ajax有浏览器缓存的问题,如果两次发送的请求都是一样的那么就会有缓存,我们就可能得不到新的数据

xhr.setRequestHeader("If-Modified-Since","0")

--》escape()对发送的中文进行转码

--》Ajax发送post请求

--》jaon格式的处理

错误页_session深入

一、错误页:当站点出现错误的时候自动导向到指定的页面,不会再出现那些错误堆栈信息,比如说出现404、500....

1)配置web.config,把下面的语句添加到system.web里

<customErrors mode="On" defaultRedirect="MyErrorPage.aspx">//如果出现的错误都没被包括在下面,就会执行这个默认的

            <error statusCode="403" redirect="NoAccess.htm" />

            <error statusCode="404" redirect="FileNotFound.htm" />

        </customErrors>

2)对应的状态响应码指向对应的页面

3)IHttpModule

一个接口:可以给请求管道里的事件注册方法,其内部定义了一个Init(HttpApplication context)方法,把HttpApplication作为参数传了进来。由于对请求的处理请求管道的事件都是在这个HttpApplication里完成的,所以我们可以定义一个类继承这个接口,通过Init方法给请求管道里的事件注册方法

--》添加应用  System.Web,导入命名空间

class HttpModule_Demo:IHttpModule

    {

        public void Dispose()

        {

            throw new NotImplementedException();

        }

        public void Init(HttpApplication context)

        {

            context.BeginRequest += new EventHandler(context_BeginRequest);给第一个事件注册方法

        }

        void context_BeginRequest(object sender, EventArgs e)

        {

            HttpContext context = (sender as HttpApplication).Context;//把sender转换成HttpApplication

            context.Response.Write("hahaah");

            context.Response.End();

        }

注册第9个事件,判断session,可以省去在每个页面的后台再去判断一次,如果在页面里判断那么就很多代码都重复了,由于在第9个事件里会从请求报文里获取sessionId已经取得了session,我们就可以在第9个事件注册方法,然后对这个session进行判断,在页面上就不用再判断了

           context.AcquireRequestState += new EventHandler(AcquireRequest);

        }

        void AcquireRequest(object sender, EventArgs e)

        {

            HttpContext context = (sender as HttpApplication).Context;

            Uri uri = context.Request.Url;

            if (uri.AbsolutePath.Contains("/admin"))

            {

                if (context.Session["Name"]!=null)

                {

                    return;

                }

                else

                {

                    context.Response.Write("你是非法用户!");

                    context.Response.End();

                }

            }

        }

URL重写、

一、URL重写

URL重写只要是为了SEO的优化,那么SEO是根据URL地址栏来爬我们的网站的,但是我们的网站的一些连接地址上往往需要带上响应的参数一起提交到服务端再根据参数做出响应(http://locallhost:8899/Default.aspx?id=111),

但是呢蜘蛛(spiter)它不喜欢带参数的(http://locallhost:8899/Default.aspx?id=111)这种url,它喜欢不带参数数的(http://locallhost:8899/Default.aspx)这样的,

但是我们有些页面又必须带上参数,这时候又想SEO优化好我们就可以通过URL重写

--》首先把带参数的URL全改掉,格式自己定:如

http://locallhost:8899/Default.aspx?id=111  ----》http://locallhost:8899/Default_111.aspx

那么把URL改成这样之后是有利于SEO了,但是Default_111.aspx这个页面并不存在,怎么解决呢

可以在客户端提交请求之后再请求管道里的BeginRequest事件里注册方法,在这个方法里面客户端请求的URL已经可以获得了,那么我们就可以在这个方法里面把这个url拿出来重写它

public Global()

        {

            base.BeginRequest += new EventHandler(Global_BeginRequest);//给HttpApplication的BeginRequest事件注册方法

        }

        /// <summary>

        /// 请求管道中的BeginRequest事件触发以后会执行这个方法

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        void Global_BeginRequest(object sender, EventArgs e)

        {

            string url=Request.AppRelativeCurrentExecutionFilePath.ToString() ;//获取客户端请求文件的系统相当路径    ~/BookList.aspx

            //判断客户端请求的文件路径是否是     ~/BookList_4499.aspx 这种形式,如果是那么用户就是请求的我们在前台也修改过的url,就是我们要重写的url

            Match mt = Regex.Match(url, @"~/BookListNumPage.aspx_(\d+).aspx");//正则表达式匹配

            if (mt.Success)//如果匹配成功,对客户端请求的url进行重写

            {

                string id = mt.Groups[1].Value;//获得Id

                HttpContext.Current.RewritePath("~/BookListNumPage.aspx?categoryid=" + id);//对url完成重写

            }

        }

1)Response.Write( Request.Url.ToString ());

获取客户端请求的全URL   http://localhost:55555/ShowMsg.aspx ;

2)Response.Write(Request.RawUrl.ToString());

获取请求的原始路径    /ShowMsg.aspx

3) Response.Write(Request.PhysicalPath.ToString());

获取客户端请求的文件在服务器机器上的物理文件路径       E:\project\BookShop\BookShop\BookShop_Demo\ShowMsg.aspx

4)Response.Write(Request.PhysicalApplicationPath.ToString()

获取当前应用程序的根的系统物理路径  E:\project\BookShop\BookShop\BookShop_Demo\

5) Response.Write(Request.Path.ToString() 、       Response.Write(Request.FilePath.ToString()   、            Response.Write(Request.CurrentExecutionFilePath.ToString()

获取当前请求的文件的虚拟路径   /ShowMsg.aspx

6) Response.Write(Request.CurrentExecutionFilePathExtension.ToString()

获取请求文件的后缀名   .aspx

7)Response.Write(Request.AppRelativeCurrentExecutionFilePath.ToString()

获取请求文件的应用程序的系统虚拟路径,以~/的形式表示法使这个路径成为相对路径    ~/ShowMsg.aspx

------>还有一个问题,submit提交的时候严格来说是向form提交,提交到form的action指定的url(action="BookListNumPage.aspx?page=1&categoryid=29&orderby=+PublishDate+asc"),那么这个url就又回到了参数的形式,我们怎么解决呢,那么可以在请求管道页面生命周期的render方法里HttpForm的render方法里对action的值进行修改

新建App_Browsers文件夹,在文件夹下新建my.browser文件

加如下配置:

<browser refID="Default">

<controlAdapters>

<adapter controlType="System.Web.UI.HtmlControls.HtmlForm" adapterType="BookShop.Web.UrlRewriterControlAdapter">

</adapter>

</controlAdapters>

</browser>

创建两个类

public class UrlRewriteAdapter:ControlAdapter//继承一个控件适配器的基类

    {

        /// <summary>

        /// 重写基类的Render方法,把textwrite传到UrlRewrite类里面,因为所有控件执行render方法之后生成的html代码都存在了这个textwrite里

        /// 下一步在UrlRewrite类里就可以修改HttpForm控件的action属性了

        /// </summary>

        /// <param name="writer"></param>

        protected override void Render(System.Web.UI.HtmlTextWriter writer)

        {

            base.Render(new UrlRewrite( writer));

        }

    }

   public class UrlRewrite : HtmlTextWriter//继承HtmlTextWriter类

    {

        public UrlRewrite(HtmlTextWriter write):base(write)

        {

            this.InnerWriter = base.InnerWriter;

        }

        /// <summary>

        /// 重写HtmlTextWriter类的WriteAttribute方法,修改HttpForm控件的action属性

        /// </summary>

        /// <param name="name">药修改的属性的名字</param>

        /// <param name="value">要写入属性的值</param>

        /// <param name="fEncode">是否要对写入的值编码</param>

        public override void WriteAttribute(string name, string value, bool fEncode)

        {

            if (name.ToLower()=="action")//判断当前这个属性是否是action

            {

                var context=HttpContext.Current;

                if (context.Items["ActionRewrite"] != null)

                {

                    value = context.Request.RawUrl;//获取原始的url

                    context.Items["ActionRewrite"] = true;//设置一个标记,true表示已经重写action属性

                }

            }

            base.WriteAttribute(name, value, fEncode);//再把修改后的值传回去给HtmlTextWriter类的WriteAttribute方法,最后向浏览器输出

        }

    }

RSS_搜索功能块

一、RSS阅读器,方便用户可以最快的知道我们网站的最新更新的信息

<?xml version="1.0"?><!--注意XML文件必须要以 <?xml version="1.0"?>开头,否则会出错-->

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Rss.aspx.cs" Inherits="BookShop_Demo.Rss" %>

<rss version="2.0">

<channel>

<title>XXX网站书店</title>   <!--标题-->

<description></description>

<link>http://www.bookshop.com</link><!--连接地址-->

<language>zh-cn</language><!--语言-->

  <item>

  <title><![CDATA[<%#Eval("Title") %>]]></title><!--显示的标题-->

  <link><%#Eval("Id","http://www.bookShop.com/BookDetail.aspx?id={0}") %></link><!--点击阅读全部之后跳转到的页面-->

  <pubDate><%#Eval("PublishDate")%></pubDate><!--发表时间-->

  <source>XXX网站书店</source><!---->

  <author><%#Eval("Author") %></author><!--作者-->

<description><![CDATA[<%#Eval("ContentDescription") %>]]></description><!--内容,注意不要把整篇文章的内容都放进去,放一部分就可以了,不然用户从RSS阅读器看完全文就不访问我们网站了-->

</item>

</channel>

</rss>

二、搜索

使用like模糊查询效率不高,因为它会到数据库区全文扫描,

解决方案数据库的全文搜索,luncene .net

==================================jueryUI

$(function () {

        $("#<%=txtSearch.ClientID %>").focus(function () {

            if ($(this).val() == "请输入搜索内容") {

                $(this).css("color", "black").val("");

            }

        }).blur(function () {

            //光标离开

            if ($(this).val() == "") {

                $(this).css("color", "Gray").val("请输入搜索内容");

            }

        });

$("#<%=txtSearch.ClientID %>").autocomplete({

            minLength: 2,

            source: "/ashx/Search.ashx"

        });

    });

           context.Response.ContentType = "text/plain";

            string str = context.Request.QueryString["term"];

            if (!string.IsNullOrEmpty(str))

            {

                BookShop.BLL.BooksBll bll = new BookShop.BLL.BooksBll();

                List<BooksModel> list = bll.GetSearchList(str);

                List<string> liststr = new List<string>();

                foreach (BooksModel item in list)

                {

                    liststr.Add(item.Title);

                }

                System.Web.Script.Serialization.JavaScriptSerializer js = new System.Web.Script.Serialization.JavaScriptSerializer();

                context.Response.Write(js.Serialize(liststr.ToArray()));

            }

        }

数往知来 ASP.NET Cookie Session Url <二十九>

标签:

原文地址:http://www.cnblogs.com/hetong/p/4798957.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!