본문 바로가기
연구_고민/ASP & MSSQL

Request 개체

by DevG 2009. 7. 8.

http://www.tandol.pe.kr/study/?cmd=prt&lecture=asp&num=6

ASP 기본 개체

▶ Request

클라이언트로부터 무언가를 받아들일 때 사용하는 개체로 QueryString, Form, ServerVariables,Cookies등이 있다.
이미 사용한 QueryString, Form과 브라우져로부터 전송되는 Cookies는 제외하고 ServerVariables만 설명한다.

ServerVariables : 사용자의 접속환경을 알게 해주는 컬렉션이다. 주로 접속지의 IP주소나, 브라우져 종류등을 알아내기 위해 사용한다. 중요 환경 변수는 다음 표와 같다.

환경변수명 설명
CONTENT_LENGTH 보내진 바이트수
CONTENT_TYPE Request가 POST타입일때 컨텐츠 타입
보통 application/x-www-form-urlencode이다
GATEWAY_INTERFACE CGI버전
LOCAL_ADDR 서버의 IP 주소
PATH_INFO 서버 파일 웹 경로
PATH_TRANSLATED 서버 파일 실제 경로
QUERY_STRING 주소줄의 ?뒤의 값
REMOTE_ADDR 클라이언트 IP주소
REMOTE_HOST 클라이언트 hostname(ip주소)
REMOTE_USER 서버에 인증받은 사용자 ID명
REQUEST_METHOD 서버로 전송된 Method
SCRIPT_NAME 실행할 애플리케이션, 스크립트이름
SERVER_NAME 서버이름 혹은 주소
SERVER_PORT 서버 포트
SERVER_PORT_SECURE Encrypt된 포트의 경우 1로된다.
SERVER_PROTOCOL 프로토콜과 버젼
SERVER_SOFTWARE 웹서버 어플리케이션이름과 버젼
URL 주소줄의 내용
HTTP_ACCEPT 브라우져에서 받아들일수 있는 MIME타입
HTTP_ACCEPT_LANGUAGE 브라우져 사용 언어
HTTP_HOST tandol.pe.kr
HTTP_USER_AGENT 브라우져종류와 버젼등
HTTP_COOKIE 쿠키값


 

모든 환경변수값을 출력하는 프로그램       [실행결과보기]
<html>
<head>
<title>
REQUEST
개체 </title>
</head>
<body>
<table
border=1>
<tr><th>
환경변수</th><th></th>
<%
for each item in request.servervariables
    for i=1 to request.servervariables(item).count
        response.write "<tr><td>"
        response.write item & "</td><td>"
        a = request.servervariables(item)(i)
        if a="" then a="&nbsp;"
        response.write a & "</td></tr>"
    next
next

%>
</table>
</body>
</html>
환경변수 사용예      [실행결과보기]
<html>
<head>
<title>
환경변수 사용예 </title>
</head>
<body>

당신의 웹 브라우져는
<%=request.ServerVariables("HTTP_USER_AGENT")%>
입니다.<br>
당신의 IP주소는
<%=request.ServerVariables("REMOTE_HOST")%>
입니다.
</body>
</html>

▶Response

서버에서 클라이언트로 정보를 전달할때 사용하는 개체로서 지난 강의 때 이미 Write와 redirect메소드를 이용 하였다. 주로 이용하는 메소드,속성, 컬렉션을 정리하면 다음과 같다.

컬렉션
Cookies 브라우져로 전송도는 모든 쿠키값
속성(프로퍼티)
buffer 페이지가 완성될때까지 버퍼할것인지 지정
charset 문자셑 - 헤드에 덧붙여진다.
ContentType 컨텐츠 형식 기본값은 text/html이다.
Expires 브라우져에서 캐시완료 기간
메소드
addHeader http헤드를 추가 혹은 변경
clear 버퍼된값을 삭제한다. buffer=true가 되어 있어야 한다
end 스크립트수행을 중단한다.
flush 버퍼의 값을 즉시 전송한다. buffer설정되어 있어야 한다.
reDirect 다른url로 이동
write 클라이언트로 전송

▶Application

서버의 모든 사용자가 전역변수 처럼 공유하는 개체이다. 메소드에는 lock과 unlock이 있다.

Application개체를 이용한 페이지 카운트      [실행결과보기]
<html>
<head>
<title>
읽은 회수 카운트 </title>
</head>
<body>

<%
application.lock
application("ReadCnt") = application("ReadCnt")+1
application.unlock
%>
현재 문서를 읽은 회수는
<%=application("ReadCnt")%>
</body>
</html>

▶Session

현재 서버에 접속된 사용자가 전역변수처럼 사용하는 개체이다.

Timeout속성은 세션의 유지시간으로 분단위이다. 예) session.timeout=10' 세션시간을 10분으로 설정
SessionID는 사용자마다 설정되는 ID로서 사용자정보를 따로 관리할때 사용된다.

 주로 로그온상태등 접속자의 상태를 기억하는 용도로 사용 된다.

간단히 만들어본 로그온 페이지      [실행결과보기]
sesnlogin.asp
<html>
<head>
<title>
Session
이용 로그인 상태 표시 </title>
</head>
<body>

<%
response.expires=0 '
웹브라우져의 캐시완료시간을 0으로 하여 항상 갱신을 한다.
s = session("Login")
if s="" then '
세션이 설정되지 않음
%>
<center>
<h2>
로그온 되어 있지 않습니다</h2>
<form
action="sesnlogin_ok.asp" method=post>
<table>
<tr><td>
ID</td><td><input type=text name=id size=20></td></tr>
<tr><td>
비밀번호</td><td><input type=password name=pwd size=20></td></tr>
</table>
<input
type=submit value="
로그인">
<input
type=button value="
취소 " onclick="history.back()">
</form>

임시로 넣어둔 idkim, park, choi이고 비밀번호는 1234
<%
else '
세션이 설정 되어 있음
%>
<h2><%=session("Login")%>(
)로 로그온 되었 습니다</h2>
<input
type=button value="
로그 아웃" onclick="location.href='sesnlogout.asp'">
<%
end if
%>
</body>
</html>
sesnlogin_ok.asp
<%
id = request.form("id")
pwd = request.form("pwd")

if id="kim" and pwd="1234" then
    session("Login")="
김씨성"
elseif id="park" and pwd="1234" then
    session("Login")="박씨성"
elseif id="choi" and pwd="1234" then
    session("Login")="최씨성"
else
    response.write "<script language='javascript'>"
    response.write "alert('잘못된 사용자이거나 비밀번호가 틀립니다');"
    response.write "history.back();"
    response.write "</script>"
    response.end
end if
response.redirect "sesnlogin.asp"
%>
sesnlogout.asp
<%
session("Login")=""
response.redirect "sesnlogin.asp"
%>

▶Server

서버의 컴포넌트 개체를 이용할 때 사용하는 CreateObject, 웹 가상경로를 실제 물리적 경로로 바꾸어주는 MapPath, 스크립트의 실행 시간을 조절해주는 ScriptTimeout등이 있다.

ex)
    set db = Server.CreateObject("ADODB.Connection")
    dbPath = Server.MapPath("sample.mdb")
    server.ScriptTimeout = 120 '
스크립트 실행 시간을 최대 120초로 설정

FilesystemObject 컴포넌트

서버의 Text 파일을 조작할 수 있도록 한다.

Set fs = server.CreateObject("Scripting.FileSystemObject")
Set a = fs.CreateTextFile("c:\testfile.txt", True)
a.WriteLine("
테스트입니다.")
a.Close

CreateObject 함수는 FileSystemObject 개체(fs)를 만들고, CreateTextFile 메서드에서는 파일을 TextStream 개체(a)로 만들고, WriteLine 메서드에서는 만들어진 텍스트 파일에 텍스트 한 줄을 작성한다. 끝으로 Close 메서드에서 버퍼를 비운 다음 해당 파일을 저장하고 닫는다.

FileSystemObject 개체의 메서드는 다음과 같다.

메서드 기능 결과값
CopyFile 원본, 대상[, 덮어 쓰기] 파일복사  
CopyFolder 원본, 대상[, 덮어 쓰기] 폴더복사  
CreateFolder(폴더 이름) 폴더 만들기  
CreateTextFile(파일 이름[, 덮어 쓰기]) 파일을 만들고 TextStream개체를 생성 TextStream 개체
DeleteFile filespec[, force] 파일삭제
force가 true이면 읽기전용 파일도 삭제된다.
 
DeleteFolder folderspec[, force] 폴더삭제
force가 true이면 읽기전용 폴더도 삭제된다.
 
FileExists(filespec) 파일 존재 여부 true/false
FolderExists(folderspec) 폴더 존재 여부 true/false
GetAbsolutePathName(pathspec) 정확한 경로명 구하기 문자열
GetBaseName(경로) 경로명에서 파일명만 추출 문자열
GetExtensionName(pathspec) 경로명에서 확장자만 추출 문자열
GetFile(filespec) 해당파일의 File 개체를 생성 File 개체
GetFileName(pathspec) 해당 경로의 파일명 구하기 문자열
GetFolder(folderspec) 해당 경로의 Folder 개체를 생성 Folder 개체
MoveFile 원본, 대상 파일 이동 및 이름 변경  
MoveFolder 원본, 대상 폴더 이동 및 이름 변경  
OpenTextFile(파일 이름, iomode) 파일을 열고 TextStream개체를 생성
iomode 기능
1 읽기전용
2 쓰기전용
8 추가용
TextStream 개체

TextStream개체의 메서드 및 속성

속성 및 메서드 기능 결과값
AtEndOfLine 파일 포인터가 TextStream 파일의 줄 끝 표식에 바로 접하여 있으면 참 true/false
AtEndOfStream 파일 포인터가 TextStream 파일 끝에 있으면 참 true/false
Close 파일 닫기  
Read(characters) 지정한 문자수만큼 읽기 문자열
ReadAll 모두 읽기 문자열
ReadLine 한 줄 읽기 문자열
Write(문자열) 지정한 문자열 저장  
WriteLine([문자열]) 지정한 문자열 저장하고 줄바꿈 문자 기록  

File/Folder개체문서읽기 -> 프로그래밍 -> VBScript 를 참조 할것

웹서버 Root의 Global.asa

웹서버의 Global.asa는 특수한 기능을 하는 파일 이다.

웹서버가 실행 할 때와 중단 할때, 사용자가 처음으로 접속할 때와 접속을 중단할 때 각각의 할 일 을 적을 수 있도록 고안 되었다.

PWS 사용자는 Global.asa변경 후 재 부팅을 해 주어야 제대로 작동 한다.

일반적인 구조는 다음과 같다.

Global.asa
<script language="VBScript" runAt="Server">
Sub Application_OnStart
'
이곳에는 웹서버가 시작할 때 실행할 스크립트를 작성한다
end sub

Sub Application_OnEnd
'
이곳에는 웹서버가 중단할 때 실행할 스크립트를 작성한다
end sub

Sub Session_OnStart
'
이곳에는 사용자가 처음 접속할 때 실행할 스크립트를 작성한다
end sub

Sub Session_OnEnd
'
이곳에는 사용자가 접속을 종료할 때 실행할 스크립트를 작성한다
end sub
</script>

방문자수 카운트 프로그램

앞의 Application개체를 이용하여 읽은 회수를 카운트 하는 스크립트에서는 두가지의 문제가 있다.

- 웹서버가 재부팅 하고나면 카운터값이 클리어 된다는 점
- 사용자가 새로 고침 버튼을 누르면 읽은 회수가 증가한다는 점

따라서 방문자 카운트로 작동 시키기 위해서는 특정 데이터 파일에 현재 카운트 한 값을 저장 해 두어야 하고
세션이 시작 될 때에만 - 즉 사용자가 접속을 할 때 -  카운트가 되어야 한다.

Global.asa의 Session_OnStart에서 이 두가지를 모두 실행하는 스크립트를 작성 해야 하고, 결과를 보는 페이지는 따로 작성해야 한다.

Web Server Root Directory 의 Global.asa (PWS 사용자는 저장 후 재부팅 필요함) 
<script language="VBScript" runAt="Server">
Sub Application_OnStart
'
이곳에는 웹서버가 시작할 때 실행할 스크립트를 작성한다
end sub

Sub Application_OnEnd
'
이곳에는 웹서버가 중단할 때 실행할 스크립트를 작성한다
end sub

Sub Session_OnStart
'
이곳에는 사용자가 처음 접속할 때 실행할 스크립트를 작성한다
    Set fs = server.CreateObject("Scripting.FileSystemObject")
    DataFile = Server.MapPath("/count.txt")
    Application.Lock '
여러사람이 동시접속 했을 때를 대비하여 잠금
    if not fs.FileExists(DataFile) then '처음으로 실행하여 파일이 존재하지 않으면
        set Stream = fs.CreateTextFile(DataFile)
        Stream.WriteLine("1")
        Application("Count") = 1
        Stream.close
    else
        set Stream = fs.OpenTextFile(DataFile, 1) '
읽기용으로 연다
        Application("Count") = Stream.ReadLine ' 읽어낸다.
        Stream.Close
        set Stream = fs.OpenTextFile(DataFile, 2) '
쓰기용으로 연다.
        Application("Count") = Application("Count") + 1 '
증가 한다.
        Stream.WriteLine(Application("Count"))
        Stream.Close
        Set Stream = nothing
        Application.Unlock '
잠김 해제
    end if
    Set fs = nothing
end sub

Sub Session_OnEnd
'
이곳에는 사용자가 접속을 종료할 때 실행할 스크립트를 작성한다
end sub
</script>
Count.asp
<!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>
방문자 수 카운터 </title>
<meta
http-equiv="content-type" content="text/html; charset=euc-kr">
<meta
http-equiv="Cache-Control" content="no-cache">
</head>
<body>

<%
'
다른 페이지에 방문자 카운터를 넣고 싶은경우 이부분을 복사해서 넣는다.
response.write "<table style='border:1px solid red;'><tr><td bgcolor=black>"
lt = cstr(application("Count"))
ln = len(lt)

for i=1 to ln
    tt = mid(lt, i, 1)
    response.write "<img src=""/images/" + tt + ".gif"" border=0 width=16 height=21>"
next
response.write "</td></tr></table>"
%>
</body>
</html>
Count.asp에 필요한 이미지 파일
(Root의 /images/폴더에 복사 한다.)
0.gif 1.gif 2.gif 3.gif 4.gif 5.gif 6.gif 7.gif 8.gif 9.gif