ASP.NET Requst, Response, Application, Session, Server
ASP 5가지 객체
1. Request(요청)
a. HttpRequest 클래스
b. this.Request 프로퍼티
2. Response(응답)
3. Application(사이트 전체)
4. Session(고객) *****
5. Server(잡다한것들..)
Session : 타이머 20분동안 메모리에 세션 객체를 살려놓는다.
20분동안에 없다면 사이트에 없는것으로 간주.
재요청시 세션객체를 20분 연장~! 계속 리셋되며 연장~!
각사용자별 세션에 객체생성
어플리케이션 시작 시점 : 첫사용자가 들어오는 순간
어플리케이션 종료 시점 : 마지막 사용자가 나가는 순간 세션시간 다찰때 어플리케이션 객체 종료 됨.
Cookie(쿠키)
- 사이트 방문자에 대한 개별적인 데이터를 사이트 운영중에 유지? 관리
1. 유지
2. 개별
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class Ex40_Check : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
//현재 페이지를 요청할 당시의 여러가지 정보
string txt = "";
txt += Request.ApplicationPath + "<br />";
txt += Request.Browser.Browser + "<br />";
txt += Request.ContentLength + "<br />";
txt += Request.ContentType + "<br />";
txt += Request.CurrentExecutionFilePath + "<br />";
txt += Request.FilePath + "<br />";
txt += Request.Path + "<br />";
txt += Request.PhysicalApplicationPath + "<br />";
txt += Request.TotalBytes + "<br />";
txt += Request.Url + "<br />";
txt += Request.UrlReferrer + "<br />";
txt += Request.UserHostAddress + "<br />";
Label1.Text = txt;
//현재 페이지가 올바른 접속 경로 통해서 접근 판단?
//if (Request.UrlReferrer != null)
//{
// if (Request.UrlReferrer.ToString().IndexOf("Ex40_Request.aspx") > -1)
// {
// //이전페이지가 없거나 올바른 경로임
// Label1.Text = "정상적인 처리..";
// }
// else
// {
// Label1.Text = "예상치 못한경로 앤드 잘못된 경로 일것임..";
// }
//}
//else
//{
// Label1.Text = "나가십시오...";
//}
}
}
}
aspx
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
</head>
<body>
<form method="post" action="Ex41_Ok.aspx">
데이터 : <input type="text" name="txtData" />
<br />
데이터 : <input type="text" name="txtData2" />
<br />
<input type="submit" value=" 보내기 " />
</form>
<br />
<a href="Ex41_Ok.aspx?txtData=test&txtData2=하하하">페이지 이동하기</a>
</body>
</html>
c#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class Ex41_Ok : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//클라이언트 -> 서버
//method
// 1. get 전송
// - Request.QueryString 컬렉션
// 2. post 전송
// - Request.Form 컬렉션
//Request[]
// - 자동으로 처음엔 QueryString 컬렉션을 뒤져서 나오면 반환, 없으면 Form 컬렉션을 뒤짐.. 있으면 반환 없으면 다음 컬렉션..
//Label1.Text = "받은 데이터 : " + Request.QueryString["txtData"];
//Label1.Text += "<br />받은 데이터 : " + Request.QueryString["txtData2"];
//Label1.Text = "받은 데이터 : " + Request.Form["txtData"];
//Label1.Text += "<br />받은 데이터 : " + Request.Form["txtData2"];
Label1.Text = "받은 데이터 : " + Request["txtData"];
Label1.Text += "<br />받은 데이터 : " + Request["txtData2"];
}
}
aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Ex42_Event.aspx.cs" Inherits="Ex42_Event" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<h2>
Ex42_Event.aspx</h2>
<br />
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<br />
<br />
<asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" />
<br />
<br />
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
<br />
<br />
</div>
</form>
</body>
</html>
c#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class Ex42_Event : System.Web.UI.Page
{
private string data;
protected void Page_Load(object sender, EventArgs e)
{
//Request.Form["TextBox1"]
// - 서버로부터 넘어오는 데이터를 받는 코드 XXX
// - 이미 넘어온 데이터가 들어있는 컬렉션을 탐색하는 코드 OOO
// - 서버로 넘어온 데이터는 Request로 여러번 엑세스 가능!!
Label1.Text = Request.Form["TextBox1"];
}
protected void Button1_Click(object sender, EventArgs e)
{
//2.5 다시 게시된 데이터 처리
// TextBox1.Text = Request.Form["TextBox1"];
//Label1.Text = TextBox1.Text;
Label1.Text += Request.Form["TextBox2"];
}
}
aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Ex43_Response.aspx.cs" Inherits="Ex43_Response" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<h2>
Ex43_Response.aspx</h2>
<h4 style="height: 171px">
<br />
Response 객체<br />
<br />
1. 출력<br />
- 임시페이지(출력스트림, 출력버퍼)에 직접 기록<br />
<!--옛날 방식-->
<% Response.Write(DateTime.Now.ToString()); %>
<br />
<br />
2. 페이지 이동<br />
- 자바스크립트와 달리 서버 쪽에서 이전 요청에 관련된 자원(페이지객체, 임시페이지..등)을 모두 소멸시키고 새로운 페이지로 이동을
하는 명령</h4>
<p style="height: 26px">
- 서버쪽에서 페이지를 바꾼다 -> 브라우저는 눈치 못챈다... </p>
<h4 style="margin-left: 40px">
<br />
</h4>
<asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button"
Width="78px" />
<br />
<br />
<asp:Button ID="Button2" runat="server" onclick="Button2_Click" Text="Button"
Width="75px" />
<br />
<br />
클라이언트가 서버에 요청을 한다면
<br />
Request페이지부터 요청후 페이지 리다이렉트시 자바스크립트로 실행하게 되면 브라우져는 무조건 페이지를 인식한다.<br />
c#으로 실행시에는 인식하지 못하고 결과 페이지만 브라우져가 인식한다.
<br />
<br />
</div>
</form>
</body>
</html>
c#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class Ex43_Response : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
//HTTP 출력 스트림
// -> 임시 페이지
//Response.Write("안녕하세요");
//Render
//디버깅
Response.Write("insert....");
//임시페이지에 저장된 임시값은 저장해놓았다가 return해준다.
Response.End();//현재까지 임시페이지에 적힌 내용을 모두 클라이언트에게 보낸뒤 페이지 처리를 강제로 종료한다.
//Execute(break point보다 편하다)
}
protected override void OnPreRender(EventArgs e)
{
//매번일어나는 이벤트 클릭이 일어나든 안일어나든
base.OnPreRender(e);
Response.Write("5단계");
}
protected void Button2_Click(object sender, EventArgs e)
{
//웹에서의 페이지 이동
// 1. HTML -> <a href="url"></a>
// 2. Javascript -> location.href = "url"
// 3. ASP.NET -> Response.Redirect("url");
Response.Redirect("Ex43_Hidden.aspx");
}
}
aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Ex43_Hidden.aspx.cs" Inherits="Ex43_Hidden" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<script type="text/javascript">
//전처리..
location.href = "Ex43_End.aspx";
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
</div>
</form>
</body>
</html>
c#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class Ex43_Hidden : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//전처리..(무언가를 처리하기한 페이지가 사이에 많이 끼어있다.
//안내메시지 내용
//Response.Redirect("Ex43_End.aspx");
}
}
aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Ex44_Application.aspx.cs" Inherits="Ex44_Application" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<style type="text/css">
.style1
{
color: #FF66CC;
}
</style>
</head>
<body>
<form id="form1" runat="server">
<div>
Application & session<br />
<br />
- 사용용도 : 데이터를 저장하는 역할(내부에 컬렉션)<br />
- Application, Session안에 저장된 데이터는 페이지가 이동되어도 살아 있음.(페이지간에 전달 과정없이도 데이터를 인식 가능) ->
<span class="style1">상태 유지 가능</span><br />
<br />
Application<br />
- 페이지객체와는 상관이 없다. 사이트가 살아 있는 동안 서버 메모리가 살아 있다.<br />
- 페이지 객체가 죽어도 Application 객체는 살아 있다.<br />
- 공용 데이터를 관리<br />
- 죽지않는 변수<br />
- 모든 페이지에서 접근 가능한 변수<br />
- 모든 사용자가 접근 가능한 변수<br />
<br />
Session<br />
- 개인 데이터를 관리 공간<br />
- 죽지않는 변수<br />
- 모든 페이지에서 접근 가능한 변수<br />
- 개인 사용자만 접근 가능한 변수(다른 사용자의 Session 접근 불가능)<br />
<br />
<br />
<br />
<asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
</div>
</form>
</body>
</html>
c#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class Ex44_Application : System.Web.UI.Page
{
public int num = 100;
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
//이미 Application 에는 배열이 있다.
int num2 = 200;
Application["num3"] = 300;//Application 변수
//한페이지 -> 다른페이지로 데이터를 전송
// "Ex44_Check.aspx?num=100&num2=200"
Response.Redirect("Ex44_Check.aspx?num=" + num + "&num2=" + num2);
}
}
c#2
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class Ex44_Check : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//Ex44_Application.aspx -> Ex44_Check.aspx 이동
//(num, num2) -> (num, num2)?
//Label1.Text = 전페이지객체.num;
//Label1.Text = num2;//지역변수(불가능한 접근)
//전페이지에서 넘어온 값을 접근
Label1.Text = Request.QueryString["num"] + " : " + Request.QueryString["num2"] + " : " + Application["num3"];
}
}
aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Ex45_Application.aspx.cs" Inherits="Ex45_Application" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
<br />
<br />
<asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button"
Width="89px" />
<br />
<br />
웹브라우져는 프로세스단위였다.<br />
새로운 프로세스를 만든다.<br />
</div>
</form>
</body>
</html>
c#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class Ex45_Application : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//잠그기 - 잠금을 풀기전까지는 이곳에서 .... 뒷사람은 대기
Application.Lock();
//Application["count"] 에 값이 없다면
if (Application["count"] == null)
{
Application["count"] = 0;
}
Application["count"] = (int)Application["count"] + 1;
Label1.Text = Application["count"].ToString();
//풀기
Application.UnLock();
}
protected void Button1_Click(object sender, EventArgs e)
{
}
}
aspx
<%@ Page
Language="C#"
AutoEventWireup="true"
CodeFile="Ex46_Session.aspx.cs"
Inherits="Ex46_Session"
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<h2>
Ex46_Session.aspx</h2>
<br />
Session 객체<br />
1. 데이터 저장 용도<br />
2. 페이지에 상관없이 접근 가능 변수(전역변수)<br />
3. 오로지 자기만 접근 가능 변수(공용변수X, 개인변수O)<br />
<br />
<br />
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
<br />
<br />
<br />
</div>
</form>
</body>
</html>
c#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class Ex46_Session : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//Session객체
// - 이미 개인당(클라이언트, 유저) Session 객체 1개 제공
//세션 변수
if (Session["name"] != null)
Label1.Text = Session["name"].ToString();
else
Label1.Text = "값없음";
Session["name"] = "홍길동";
Label1.Text = Session["name"].ToString();
}
}
aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Ex47_Count.aspx.cs" Inherits="Ex47_Count" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<h2>
Ex47_Count.aspx</h2>
<br />
<h2>
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
<br />
<br />
<asp:Label ID="Label2" runat="server" Text="Label"></asp:Label>
<br />
</h2>
<br />
</div>
</form>
</body>
</html>
c#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class Ex47_Count : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
if (Session["cnt"] == null)
Session["cnt"] = 0;
Session["cnt"] = (int)Session["cnt"] + 1;
Application.Lock();
if (Application["cnt"] == null)
Application["cnt"] = 0;
Application["cnt"] = (int)Application["cnt"] + 1;
Application.UnLock();
Label1.Text = Session["cnt"].ToString();
Label2.Text = Application["cnt"].ToString();
}
}
}
aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Ex48_Session.aspx.cs" Inherits="Ex48_Session" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<h2>
Ex48_Session.aspx</h2>
<br />
<h2>
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
<br />
</h2>
<br />
<br />
</div>
</form>
</body>
</html>
c#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class Ex48_Session : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//24자리 임의의 수 = (26+10)^24
//mmes4iqqykli4nm1iqgmjxp1
// - 임시 ID
//사용자를 구분하기위한 세션 값
Label1.Text = Session.SessionID;
Session.Timeout = 1;
if (Session["num"] == null)
Session["num"] = 100;
else
Session["num"] = (int)Session["num"] + 1;
Label1.Text = Session["num"].ToString();
}
}
aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Ex49_Server.aspx.cs" Inherits="Ex49_Server" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<h2>
Ex49_Server.aspx</h2>
<br />
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
<br />
<br />
<asp:Label ID="Label2" runat="server" Text="Label"></asp:Label>
<br />
<br />
<asp:Label ID="Label3" runat="server" Text="Label"></asp:Label>
<br />
<br />
<asp:Label ID="Label4" runat="server" Text="Label"></asp:Label>
<br />
</div>
</form>
</body>
</html>
c#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class Ex49_Server : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//Server 하는 역할
//1. 가상경로를 로컬(물리)경로로 반환
string url = "images/angry.png";
Label1.Text = Server.MapPath(url);
//2. 태그 인코딩, 디코딩
//태그를 데이타로 보고싶을때 필요하다.
string txt = "<u>홍길동</u>";
//txt = txt.Replace("<", "<").Replace(">", ">").Replace("\"", """).Replace("&", "&");
txt = Server.HtmlEncode(txt);
//3. URL 인코딩, 디코딩
// - URL 주소에는 사용가능한 문자, 사용 불가능한 문자
// - & : vpdlwl?zl=rkqt?zl=rkqt?zl=rkqt
// - %
// - 공백 사용X, 한글 사용 X
//Ok.aspx?txt=50& 한글 공백 //올바르지않음
string data = Server.UrlEncode("50&한글 공백"); //사용가능하게 알아서 변환해줌
string url2 = "Ok.aspx?txt=" + data;
//Label3.Text = url2;
Label3.Text = Server.UrlDecode("50%26%ed%95%9c%ea%b8%80+%ea%b3%b5%eb%b0%b1");
//환경 변수 제공
Label4.Text = Request.ServerVariables["SERVER_SOFTWARE"].ToString();
//XML
//-> CDataSection
txt = Server.HtmlDecode(txt);
Label2.Text = txt;
}
}