ISO및 CCITT에서 권고하는 개방형 시스템 상호 접속 (OSI:Open System Interconnection)을 위한 참조 모델(reference model)
OSI 참조 모델은 컴퓨터 통신망 구조의 기본 모델이며 7계층으로 구성되어 있다

주요 용어

  • OSI 모델 :
    서로 개방되어 있는 시스템 간에 정보를 교환하기 위한 표준
  • 캡슐화 :
    데이터에 각 계층의 제어정보를 추가하는 것
  • 역캡슐화 :
    캡술화의 반대 개념으로 최하위 물리 계틍에서 퇴상위 응용 계틍까지 데이터 전달에서 각 계층의 제어정보를 제거하는 것
  • CASE :
    공통 응용 서비스 요소로 응용에 무관하게 개방 시스템 접속을 위한 방법 제공

OSI 참조 모델의 개요

OSI 참조 모델의 목적

  • ISO 7498 (198년)
    HW/SW 관계없이 서로 다른, 개방되어 있는 시스템 간에 통신을 용이하게 하는 데 목적
  • 개방형 시스템의 상호접속을 위한 참조 모델
  • 이기종(heterogeneous) 시스템간의 통신이 가능하도록
  • 개방(형) 시스템 : 적용 가능한 표준을 상호 인정하고 지원

OSI의 계층

  • 7계층 OSI 참조 모델
    • 응용 계층 (Application Layer)
    • 표현 계층 (Presentation Layer)
    • 세션 계층 (Session Layer)
    • 전송 계층 (Transport Layer)
    • 네트워트 계층 (Network Layer)
    • 데이터링크 계층 (Data Link Layer)
    • 물리 계층 (Physical Layer)
  • 중계 개방 시스템을 갖는 계층
    • 네트워크
    • 데이터링크
    • 물리

계층의 분리원칙

  1. 너무 많은 계층으로 분리함으로써 각 계층에 대한 설명과 이들에 대한 조합이 필요 이상으로 많지 않아야 한다.
  2. 서비스의 양이 적고 최소의 상호 작용이 일어나도록 경계를 정해야 한다.
  3. 수행하는 일의 측면에서나 필요로 하는 기술의 측면에 있어서 명백히 서로 다른 기능들을 다룰 수 있도록 계층을 설정한다.
  4. 비슷한 기능들은 같은 계층에 존재하도록 한다.
  5. 과거의 경험에 의해 성공적이라 판단되는 곳에 경계를 설정한다.
  6. 쉽게 세분화되는 기능을 하나의 계층으로 한다.
  7. 필요한 경우 표준화된 인터페이스를 가질 수 있는 곳에 경계를 설정한다.
  8. 데이터에 대한 조작, 즉 구문(syntax), 의미(semantic) 등의 추상적 개념에 대해 서로 다른 수준을 필요로 하는 곳에서 계층을 설정한다.
  9. 각 계층은 단지 상위 계층과 하위 계층에 경계를 갖도록 한다. 즉, 다른 계층과는 전혀 무관하도록 한다.

각 계층이 필요한 이유

  • 물리 계층 :
    종단 간을 연결 하려면 다양한 물리적 매체를 사용하는 구조가 필요
  • 데이터링크 계층 :
    전화회선, 광섬유 등 물리적 통신 매체를 사용할 결루에 서로 다른 데이터링크 제어 절차가 필요함
  • 네트워트 계층 :
    전송주체(송/수신자) 사이에 중간 노드가 있는 경우에도 전송 주체 간의 연결 통로(네트워크 연결)를 제공해야 함
  • 전송 계층 :
    발신지 시스템에서 목적지 시스템까지의 신뢰성 있는 데이터 이동을 제어할 필요가 있음
  • 세션 계층 :
    대화를 조직하고 동기화하거나 데이터 교환을 관리할 필요가 있음
  • 표현 계층 :
    응용 프로그램의 구조화된 데이터를 표현하고 조정하는 기능이 필요함
  • 응용 계층 :
    응용 프로그램을 위한 프로토콜을 함께 관리할 필요가 있음

캡슐화

데이터에 각 계층의 제어정보를 추가하는 것
Service Data Unit + Protocol Control Information => Protocol Data Unit
SDU + PCI = PDU

  • 응용 계층 : Data
  • 표현 계층 : APDU
  • 세션 계층 : PPDU
  • 네트워트 계층 : SPDU
  • 전송 계층 : TPDU
  • 데이터링크 계층 : NPDU
  • 물리 계층 : DLPDU

각 계층의 목적 및 기능

응용 계층

  • 기본적인 서비스
    • 각 사용자에게 속하는 서비스
    • 각 응용에 속하는 서비스 요소
    • 공통 응용 서비스 요소
  • CASE(Common Application Service Element) :
    응용에 무관하게 개방 시스템 접속을 위한 방법 제공
  • 응용 계층의 기능
    • 응용 계층 기능들의 그룹화
    • 응용 프로세스 관리
    • 시스템 관리
    • 응용계층 관리

표현 계층

  • 응용 계층과 세션 계층 사이
  • 목적 : 응용체들 사이의 데이터 교환
    • 응용체들이 통신하거나 참조할 수 있도록 정보를 표현하는 기능을 제공
    1. 응용체간에 교환되어야 할 데이터를 표현
    2. 응용체들의 총신에서 참조할 수 있는 데이터 구조를 표현
  • 구문독립성 (syntac independence) 제공
    • 표현 계층은 데이터가 표현되는 구문(syntax)에만 관계하며, 응요 계층과 관계있는 의미(semantics)와는 무관
    1. 구문 변환(syntax transformation) :
      코드와 글자의 변환, 데이터 구조의 변환, 데이터 구조에 대한 연산의 결정등
    2. 구문 선택(syntax selection) :
      초기에 알맞는 구문을 선택하고 선택한 구문을 수정하는 것을 포함
  • 표현 계층의 기능
    • 구문의 변환
    • 구문의 절충
    • 주소지정과 다중화
    • 표현 계층 관리

세션 계층

  • 표현 계층과 전송 계층의 사이
  • 목적 : 표현체들 사이의 데이터 교환
    • 표현 계층들의 대화(dialogue) 세션의 형성과 동기, 정상적인 데이터의 교환
  • 세션 계층의 기능
    • 세션 연결 설정 (end-to-end 세션 연결 구성)
    • 정상적인 데이터 통신 (흐름 제어 등 포함)
    • 세션 연결 해제
    • 신속 데이터 (expedite data) 전송
    • 세션 연결 복구
    • 세션 계층 관리

전송 계층

  • 세션 계층과 네트워크 계층의 사이
  • 목적 : 세션 계층들 사이의 데이터 교환
    • 세션을 갖고 있는 두 이용자 사이의 정확한 데이터 전송 서비스를 제공
  • end-to-end message delivery
  • 가능한 네트워크 서비스를 최대로 이용하여 최소의 경비로 각 세션 계층의 요구 사항을 수행
  • 전송 계층의 기능
    • 주소 변환 (전송 주소를 네트워크 주소로 변환)
    • end-to-end 전송 연결 구성
    • 다중화와 분리(splitting)
    • 전송 연결의 설정과 해제
    • 각각의 연결에 대해서 양 종단간의
      • 순서제어, 오류 검출, 오류 복구, 흐름 제어
      • segmenting, blocking, concatenation
    • 신속 데이터 전송
    • 전송 계층 관리

네트워트 계층

  • 전송 계틍과 데이터 링크 계층 사이
  • 목적 : 전송체들 사이의 데이터 교환
    • 라우팅(routing) 전략을 사용하여 데이터를 송신지 컴퓨터로부터 여러 네트워크를 거쳐 수신지 컴퓨터까지 전달
  • 네트워크 계층의 기능
    • 경로선택과 중계(routing and relaying)
    • 네트워크 연결(network connection)
    • 네트워크 연결의 다중화
    • 세그멘팅과 블로킹
    • 오류 검출 및 오류 통보
    • 순서 냐열(sequencing)
    • 흐름제어
    • 신속 데이터 전송 서비스
    • 네트워크 계층 관리

데이터링크 계층

  • 네트워크 계층과 물리 계층의 사이
  • 목적 : 네트워크체들 사이의 데이터 교환
    • 네트워크체들 사이에 데이터링크 연결을 설정, 유지, 해제하여 데이터(데이터링크 SDU)를 교환
    • node-to-node delivery
  • 데이터링크 계층의 기능
    • 데이터링크 연결의 설정 및 해제
      • node-to-node 데이터링크 연결 구성
    • 데이터 링크 SDU의 전송
    • 네트워크 연결 종단 확인명 제공
    • 순서나열(sequencing)
    • 오류 검출, 오류 복구 및 오류 통보
    • 흐름 제어
    • 데이터 링크 계층의 관리

물리 계층

  • 데이터링크 계층 아래
  • 목적 : 데이터링크체들 사이의 데이터 교환
    • 물리적 연결의 설정, 유지, 해제를 통해 하나의 노드에서 다음 노드까지 각 비트를 전송
  • 물리 계층의 기능
    • 물리적 연결(physical connection) : 물리적 매체와의 인터페이스
    • 물리적 서비스 데이터(PSDU)의 전송 : 비트의 복호화 및 부호화, 비트 전송 속도, 비트 동기화
    • 물리적 연결 종단 확인명(endpoint identifier) 제공
    • 물리 계층 관리

요약

  1. OSI 모델의 목적은 특정 시스템의 하드웨어나 소프트웨어에 관계 없이 서로 다른 시스템 간에 통신을 용이하게 하는 것.
  2. OSI의 참조 모델은 7개의 계층으로 구성됨.
    응용, 표현, 세션, 전송, 네트워크, 데이터링크, 물리
  3. OSI 참조 모델에서 계층화란 계층과 계층을 구문하는 것으로 경계가 어디서 어떻게 이루어져야 하는 지 등에 관한 일반적인 원틱을 따름.
    이 원칙이란 크게 보면 컴퓨터과학에서 사용해오는 체계적인 접근방법에서 중요시하는 원칙임.
    System approach : modular design, component-based design, object-oriented design
  4. 캡슐화란 전송하고자 하는 데이터에 해당 계층의 제어정보를 추가하는 것임.
    이때 전송하고자 하는 데이터는 SDU(Service Data Unit)이라 하고, 제어정보는 PCI(Protocol Control Information), SDU에서 PCI를 추가한 데이터를 PDU(Protocol Data Unit)라고 부름.
  5. 응용 계층은 사용자에게 OSI 모델로서의 액세스와 분산정보 서비스를 제공함.
  6. 표현 계층은 데이터의 표현상에 존재하는 상이점으로부터 응용 프로세스에 독립성을 제공함.
  7. 세션 계층은 응용 간의 통신을 위한 제어구조를 제공하며, 서로 연관된 응용 간의 접속을 설정, 유지, 종결함.
  8. 전송 계층은 종점 간의 신뢰성 있고 투명한 데이터 전송을 제공, 두 종점 간 오류 복구와 흐름제어를 제공함.
  9. 네트워크 계층은 시스템 간을 연결하는 데이터 전송과 교환기법으로부터의 독립성을 유지하여 상위 계층에 제공하며, 접속의 설정, 유지, 종결의 책임을 짐.
  10. 데이터링크 계층은 물리적 링크 간의 신뢰성 있는 정보 전송을 제공하며, 필요한 동기화, 오류제어, 흐름제어를 담당, 데이터의 블록을 전송함.
  11. 물리 계층은 물리적 전송매체상의 비트 스트림 전송에 관한 기능을 담당함. 물리적 전송매체에 접속하기 위한 기계적 / 전기적 / 절차적 특성을 취급함.

 

출처 : 방송통신대 강의 자료실 정보통신망 강의록

 
728x90
반응형

'Computer Science > Network' 카테고리의 다른 글

LAN; 근거리 통신망 - II  (0) 2022.06.12
LAN; 근거리 통신망 - I  (0) 2022.06.12
TCP/IP - III  (0) 2022.06.12
TCP/IP - II  (0) 2022.06.12
TCP/IP - I  (0) 2022.06.12

ASP Global.asa 파일

Global.asa 파일은 ASP 어플리케이션의 모든 페이지에서 엑세스 할 수 있는 객체, 변수 및 메소드의 선언을 포함할 수 있는 선택적 파일임.

유효한 모든 프라우져 스크립트(JS, VBScript, JScript, PerlScript)등 Global.asa 파일내에서 사용 가능.

Global.asa 파일에는 다음 항목만 포함할 수 있음.

  • 어플리케이션 이벤트
  • 세션 이벤트
  • <object> 선언
  • TypeLibrary 선언
  • #include 지시문

Global.asa 파일은 ASP 어플리케이션의 루트 디렉토리에 저장해야 하며 각 어플리케이션에는 Global.asa 파일이 하나만 있을 수 있음

 


Global.asa의 이벤트

Global.asa에서 어플리케이션/세션이 시작될 때 수행할 작업과 어플리케이션/세션이 종료될 때 수행할 작업을 어플리케이션 및 세션 객체에 알릴 수 있음. 이에 대한 코드는 이벤트 핸들러에 배치됨. Global.asa 파일에는 네 가지 유형의 이벤트가 포함될 수 있음.

  • Application_OnStart : First 사용자가 ASP 어플리케이션의 첫 페이지를 호출할 때 발생.
    이 이벤트는 웹 서버를 다시 시작한 후 또는 Global.asa 파일을 편집 후에 발생함.
    Session_OnStart 이벤트는 이 이벤트 직후에 발생함.
  • Session_OnStart : 이 이벤트는 새 사용자가 ASP 어플리케이션에서 첫 페이지를 요청할 때마다 발생.
  • Session_OnEnd : 이 이벤트는 사용자가 세션을 종료할 때마다 발생함.
    사용자 세션은 지정된 시간(기본 20분) 동안 사용자가 페이지 요청하지 않으면 종료됨.
  • Application_OnEnd : 이 이벤트는 마지막 사용자가 세션을 종료한 후에 발생함.
    일반적으로 이 이벤트는 웹 서버가 중지될 때 발생함. 이 절차는 레코드 삭제 또는 텍스트 파일에 정보 쓰기와 같이 어플리케이션이 중지된 후 설정을 정리하는데 사용됨.

Global.asa

  <script language="vbscript" runat="server" >

    sub Application_OnStart
    'some code
    end sub

    sub Application_OnEnd
    'some code
    end sub

    sub Session_OnStart
    'some code
    end sub

    sub Session_OnEnd
    'some code
    end sub

  </script>

 

 


<객체> 선언

<object> 태그를 사용하여 Global.asa에서 세션 또는 어플리케이션 범위의 객체를 만들 수 있음.
<object> 태그는 <script> 태그 밖에 있어야 함.

  <object runat="server" scope="scope" id="id" {porgid="progID" | classid="classID"}>
    ...
  </object>
  • scope :
    Sets the scope of the object (either Session or Application)
  • id :
    Specifies a unique id for the object
  • progId :
    An id associated with a class id. The format for ProgID is [Vendor.]Component[.Version]
    Either ProgID or ClassID must be specified.
  • ClassId :
    Specifies a unique id for a COM class object.
    Either ProgID or ClassID must be specified.

ex

첫 번째 예는 ProgID 매개변수를 사용하여 MyAd라는 세션 범위 객체 생성임.
<obejct runat="server" scope="session" id="MyAd" progId="MSWC.AdRotator" > </object>

두 번째 예는 ClassID 매개변수를 사용하여 MyConnection이라는 어플리케이션 범위 객체 생성임.

  <object
    runat="server" scope="application" id="MyConnection"
    classid="Clsid:8AD3067A-B3FC-11CF-A560-00A0C9081C21">
  </object>

Global.asa 파일에 선언된 개체는 응용프로그램의 모든 스크립트에서 사용 가능함.

  <object runat="server" scope="session" id="MyAd" progid="MSWC.AdRotator">
  </object>
  <%=MyAd.GetAdvertisement("/banners/adrot.txt")%>

 

 



TypeLibrary 선언

TypeLibrary는 COM 개체에 해당하는 DLL 파일의 내용에 대한 컨테이너임. Global.asa 파일에 TypeLibrary에 대한 호출을 포함하면 COM 개체의 상수에 엑세스할 수 있으며 ASP 코드에서 오류를 더 잘 보고할 수 있음. 웹 어플리케이션이 형식 라이브러리에서 데이터 형식을 선언한 COM 객체에 의존하는 경우 Global.asa에서 형식 라이브러리를 선언할 수 있음.

문법

  <!-- METADATA TYPE="TypeLib"
    file="filename" uuid="id" version="number" lcid="localeid"
   -->
Parameter Description
file 유형 라이브러리의 절대 경로를 지정함. 파일 매개변수 또는 UUID 매개변수가 필요함.
UUID 유형 라이브러리의 고유 식별자 지정. 파일 매개변수 또는 UUID 매개변수가 필요함.
version 선택사항으로 버젼을 선택하는데 사용. 요청된 버젼이 없다면 가장 최근 벼전이 사용됨.
lcid 선택사항으로 유형 라이브러리에 사용할 지역 식별자.

오류 값

서버는 다음 오류 메세지중 하나를 반환할 수 있음.

Parameter Description
ASP 0222 잘못된 라이브러리 사양
ASP 0223 라이브러리 찾을 수 없음
ASP 0224 라이브러리 로드 불가
ASP 0225 라이브러리 래핑 불가

METADATA 태그는 Global.sas 파일의 모든 위치에 나타날 수 있음. (<script> 태그 내 외부).
BUT, METADATA 태그는 Global.sas 파일의 상단에 표시하는 것이 좋음.

제한

Global.asa 파일에 포함할 수 있는 항목데 대한 제한 사항 :

  • Global.asa 파일에 작성된 텍스트는 표시할 수 없음. 이 파일은 정보를 표시할 수 없음.
  • Application_OnStart 및 Application_OnEnd 서브루틴에서는 서버 및 어플리케이션 개체만 사용할 수 있음.
    Session_OnStart 서브루틴에서 내장 객체를 사용할 수 있음.
    Session_OnEnd 서브루틴에서 서버, 어플리케이션 및 세션 개체를 사용할 수 있음.

서브루틴 사용법

Global.asa는 종종 변수를 초기화 하는 데 사용함.
방문자가 웹 사이트에 처음 도착한 시간을 감지하는 방법임.
시간을 "started"라는 세션 변수에 저장되며 "started" 변수의 값은 어플리케이션의 모든 ASP 페이지에 엑세스할 수 있음.

  <script language="vbscript" runat="server" >
    sub Session_OnStart
      Session( "started" ) = now()
    end sub
  </script>

아래 예는 모든 신규 방문자를 다른 페이지로 리다이렉션 하는 방법

  <script language="vbscript" runat="server">
    sub Session_OnStart
      response.redirect( "newpage.asp" )
    end sub
  </script>

그리고 Global.asa 파일에 기능을 포함할 수 있음.

Application_OnStart 서브루팅은 웹 서버가 시작될 때 발생함.
그런 다음 Application_OnStart 서브루틴은 "getcustomers" 라는 다른 서브루틴을 호출함.
"getcustomers" 서브루틴은 DB의 "customers" 테이블에서 데이터를 배열로 가져옴.

  <script language="vbscript" runat="server">
    sub Application_OnStart
      getCustomers
    end sub

    sub getCustomers
      set conn = Server.CreateObject( "ADODB.Connection" )
      conn.Provider = "Microsoft.Jet.OLEDB.4.0"
      con.Open "c:/webdata/northwind.mdb"

      set rs = conn.execute( "SELECT NAME FROM customers" )

      Application( "customers" ) = rs.GetRows

      rs.close
      conn.close
    end sub
  </script>

 

 

Global.asa 예

현재 방문자수를 계산하는 Global.asa 파일을 만들어 봄

  • Application_OnStart는 서버가 시작될 때 어플리케이션 변수 "visitors"를 0으로 할당.
  • Session_OnStart 서브루틴은 새 접속자가 접근할 때 마다 변수 "visitors"를 1씩 추가.
  • Session_OnEnd 서브루틴은 접속자가 나갈 때 마다 변수 "visitors"를 1씩 감소.
  sub Application_OnStart
    Application( "visitors" ) = 0
  end sub

  sub Session_OnStart
    Application.lock
    Application( "visitors" ) = Application( "visitors" ) + 1
    Application.unlock
  end sub

  sub Session_OnEnd
    Application.lock
    Application( "visitors" ) = Application( "visitors" ) - 1
    Application.unlock
  end sub
  <head>
    There are <%=application( "visitors" )%> on online now!
  </head>

728x90
반응형

'WEB > ASP' 카테고리의 다른 글

[ASP IIS] 윈도우 10 IIS 및 클래식 ASP 설정  (0) 2021.09.06
[ASP] AJAX  (0) 2021.08.30
[ASP] #include  (0) 2021.08.27
[ASP] 어플리케이션  (0) 2021.08.27
[ASP] 세션  (0) 2021.08.27

ASP 세션 객체

컴퓨터에서 어플리케이션으로 작업할 때 어플리케이션을 열고 일부 변경한 다음 닫음.
이건 세션와 유사한데, 컴푸터는 작업자가 누군지 알고있고, 어플리케이션을 열 때와 닫을 때를 알고 있음.
그러나 인터넷에는 한 가지 문제점이 있는데, HTTP 주소는 상태 유지를 지원하지 않기 때문에 웹서버는 당신이 누구이고, 무엇을 하는지 모름.

ASP는 각 사용자에 대해 고유 쿠키를 만들어 이 문제를 해결함. 쿠키는 컴퓨터로 전송되며 사용자를 식별하는 정보가 포함됨.
이 인터페이스를 Session 객체라고 함.

Session 객체는 사용자 세션에 대한 정보를 저장하거나 설정을 변경함.

Sessio 객체에 저장된 변수는 단일 사용자에 대한 정보를 보유하며, 하나의 어플리케이션의 모든 페이지에서 사용할 수 있음. 세션 변수에 저장되는 공통 정보는 이름, ID 및 기본 설정등임. 서버는 각각의 새 사용자에 대해 새 Session 객체를 만들고, 세션이 만료되면 session 객체를 삭제함.

 


세션의 시작

  • 새 사용자가 ASP 파일을 요청하고 Global.asa 파일에는 Session_OnStart 프로시져가 포함됨.
  • 값은 세션 변수에 저장됨.
  • 사용자가 ASP 파일을 요청하고 Global.asa 파일은 <object> 태그를 사용하여 세션 범위의 개체를 인스턴스화 함.

세션의 종료

사용자가 지정된 기간 (기본 시간은 20분) 동안 어플리케이션에서 페이지를 요청하거나 새로 고치치 않으면 세션은 종료됨.

기본보다 짧거나 긴 시간 초과 간격을 사용하려면 Timeout 속성을 사용해야 함.

  //  세션 유지 시간을 5분으로 설정함.
  Session.Timeout = 5

Abandon 메소드를 사용하여 세션을 즉시 종료함.

  Session.Abondon

세션의 주요 문제는 세션을 종료해야하는 시간임. 사용자의 마지막 요청이 마지막 요청인지 아닌지 알 수 없음. 따라서 세션을 "활성" 상태로 유지해야하는 기간을 알 수 없음. 유휴 세션을 너무 오래 기다리면 서버의 리소스가 소모되지만 세션이 너무 빨리 삭제되면 서버가 모든 정보를 삭제했기 때문에 사용자가 처음부터 다시 시작해야 할 수 있음. 적절한 세션초과 시간을 찾는 것은 어려움.
세션 변수에 데이터를 너무 많이 저장해 둬도 좋지 않음.

 

 


세션 변수 저장 및 검색

세션 객체에서 가장 중요한 것은 변수를 저장할수 있다는 것임.

  <%
    session( "username" ) = "borry"
    seesion( "age" ) = 3
  %>

값이 세션 변수에 저장되면 ASP 어플리케이션의 모든 페이지에서 이 값에 도달할 수 있음.

Welcome <%response.write( session( "username" ) ) %>

세션 객체에 사용자 기본 설정을 저장한 다음 해당 기본 설정에서 엑세스하여 사용자에게 반환할 페이지를 선택할 수도 있음.

  <%IF session( "screenres" ) = "low" THEN%>
    This is the text version of the page
  <%ELSE%>
    This is the multimedia version of the page
  <%END IF%>

 

세션 변수 제거

Contents 컬렉션에는 모든 세션 변수가 포함됨.
remove 메소드를 사용하면 세션 변수를 제거할 수 있음.
"age"값이 18보다 작은 경우 세션 변수 "sale"을 제거함

  <%
    session.( "sale" ) = true

    if session.contents( "age" ) < 18 then
      session.contents.remove( "sale" )
    end if
  %>

세션의 모든 변수를 제거하려면 removeAll 메소드를 사용함.

  session.contents.removeAll()

 

 


컨텐츠 컬렉션을 통해 반복문

contents collection에 모든 세션 변수가 포함됨. contents collection을 반복하여 컬렉션에 무엇이 저장되어 있는지 확인 가능함.

  session( "username" ) = "borry"
  session( "age" ) = 3

  dim i
  for each i in session.contents
    response.write( i & "<br/>" )
  next

contents collection의 항목 수를 모르는 경우 count 속성을 사용할 수 있음.

  <%
    dim i, j
    j = session.contents.count
    response.write( "session variables : " & j )

    for i = 1, to j
      response.write( session.contents( i ) & "<br/>" )
    next
  %>

 

StaticObjects Collection을 통한 반복문

StaticObjects Collection을 반복하여 session 객체에 저장된 모든 개체의 값을 볼 수 있음. 나는 이 코드가 작동 안 하는데 원인은 모르겠다.

  <%
    dim k
    for each k in session.staticObjects
      response.write( k & "<br/>" )
    next
  %>

728x90
반응형

'WEB > ASP' 카테고리의 다른 글

[ASP] #include  (0) 2021.08.27
[ASP] 어플리케이션  (0) 2021.08.27
[ASP] 쿠키  (0) 2021.08.26
[ASP] form  (0) 2021.08.26
[ASP] 반복문  (0) 2021.08.26

세션 유져 카운터 클래스

import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class SessionUserCounter implements HttpSessionListener {
  private static Logger logger = LoggerFactory.getLogger(SessionUserCounter.class);
  
  //  총 접속자 수
  public static int count;
  
  public static int getCount() {
    return count;
  }

  @Override
  public void sessionCreated(HttpSessionEvent event) {
    //  세션이 생성될 때 세션객체를 꺼내옴.
    HttpSession session = event.getSession();
    count ++;
    logger.error("\n\tSESSION CREATED : {}, TOTAL ACCESSER : {}", session.getId(), count);
  }

  @Override
  public void sessionDestroyed(HttpSessionEvent event) {
    // 세션이 소멸될 때
    count--;
    if( count < 0 ) count = 0;
    
    HttpSession session = event.getSession();
    logger.error("\n\tSESSION DESTROYED : {}, TOTAL ACCESSER : {}", session.getId(), count);
  }
  
}

 

web.xml 설정

  <listener>
    <listener-class>{패키지 경로}.SessionUserCounter</listener-class>
  </listener>

 

Java 소스에서 클래스를 불러와서 사용해도 되고, JSP에서 class를 import 해서 사용해도 된다.

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" trimDirectiveWhitespaces="true"
	import ="{패키지 경로}.SessionUserCounter"
%>
현재 접속자 수 : <%=SessionUserCounter.getCount()%>

 

 

스프링 허접이라 Lazy-Init SingleTon Pattern을 사용해야 하는지, 아니면 Listener에 등록된 객체이기 때문에 필요 없는지는 잘 모르겠다.

728x90
반응형

egovframework의 EgovHttpSessionBindingListener 클래스와 EgovMultiLoginPreventor 클래스로 중복 로그인 방지를 구현하던 중,
java.lang.illegalargumentexception setattribute non-serializable attribute ***에러가 발생했다.

session에 저장하기 위해선 해당 클래스 Serializable 클래스를 상속해 줘야 하는데, VO는 이미 상속이 되어 있었다.

VO 말고도 EgovHttpSessionBindingListener, EgovMultiLoginPreventor역시 Serializable 클래스를 상속해줘야 한다.

egov도 버젼 코드에 실수가 존재하나보다.

 

EgovHttpSessionBindingListener.java

package egovframework.com.utl.slm;

import java.io.Serializable;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @Class Name : EgovHttpSessionBindingListener.java
 * @Description : 중복 로그인 방지를 위해 사용자의 로그인 아이디와 세션을 제어하는 구현 클래스
 * @Modification Information
 *
 *               수정일 수정자 수정내용 ------- ------- ------------------- 2014.09.30 표준프레임워크 최초생성
 * @author YJ Kwon
 * @since 2014.09.30
 * @version 3.5
 */
public class EgovHttpSessionBindingListener implements HttpSessionBindingListener, Serializable {

  private static final long serialVersionUID = -6535453381287200501L;
  private static Logger logger = LoggerFactory.getLogger(EgovMultiLoginPreventor.class);

  /**
   * 사용자의 로그인 세션에 EgovHttpSessionBindingListener가 바인딩될 때 자동 호출되는 메소드로, 사용자 세션이 이미 존재하는지를 검사하여 하나의
   * 어플리케이션 내에서 하나의 세션만 유지되도록 한다
   */
  public void valueBound(HttpSessionBindingEvent event) {
    logger.error("\n\t!! VALUE BOUND !!");
    if (EgovMultiLoginPreventor.findByLoginId(event.getName())) {
      EgovMultiLoginPreventor.invalidateByLoginId(event.getName());
    }

    EgovMultiLoginPreventor.loginUsers.put(event.getName(), event.getSession());
  }


  /**
   * 
   * 로그아웃 혹은 세션타임아웃 설정에 따라 사용자 세션으로부터 EgovHttpSessionBindingListener가 제거될 때 자동 호출되는 메소드로, 사용자의 로그인
   * 아이디에 해당하는 세션을 ConcurrentHashMap에서 모두 제거한다
   */
  @Override
  public void valueUnbound(HttpSessionBindingEvent event) {
    logger.error("\n\t!! VALUE UNBOUND !!");
    EgovMultiLoginPreventor.loginUsers.remove(event.getName(), event.getSession());
  }

}

 

 

EgovMultiLoginPreventor.java

package egovframework.com.utl.slm;

import java.io.Serializable;
import java.util.Enumeration;
import java.util.concurrent.ConcurrentHashMap;

import javax.servlet.http.HttpSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @Class Name : EgovMultiLoginPreventor.java
 * @Description : 중복 로그인 방지를 위해 사용자의 로그인 아이디와 세션 아이디를 관리하는 구현 클래스
 * @Modification Information
 *
 *               수정일 수정자 수정내용 ------- ------- ------------------- 2014.09.30 표준프레임워크 최초생성
 * @author YJ Kwon
 * @since 2014.09.30
 * @version 3.5
 */
public class EgovMultiLoginPreventor implements Serializable {

  private static final long serialVersionUID = 4012190701164146206L;

  private static Logger logger = LoggerFactory.getLogger(EgovMultiLoginPreventor.class);

  public static ConcurrentHashMap<String, HttpSession> loginUsers =
      new ConcurrentHashMap<String, HttpSession>();

  /**
   * 사용자의 로그인 아이디로 생성된 세션이 있는지를 확인한다
   */
  public static boolean findByLoginId(String loginId) {
    logger.error("\n\t>> loginUsers id : {} <<", loginId);
    return loginUsers.containsKey(loginId);
  }


  /**
   * 사용자의 로그인 아이디로 이미 존재하는 세션을 무효화한다
   */
  public static void invalidateByLoginId(String loginId) {
    Enumeration<String> e = loginUsers.keys();

    while (e.hasMoreElements()) {
      String key = (String) e.nextElement();

      logger.error("\n\t>> session key : {} <<", e.toString());
      if (key.equals(loginId)) {
        logger.error("\n\t:: SESSION INVALIDATE {} <<", loginId);
        loginUsers.get(key).invalidate();
      }
    }
  }

}
728x90
반응형

+ Recent posts