안전 한 JSP 프로그램 작성

저자:서 춘 김 JSP 는 기본적으로 다 중 스 레 드 방식 으로 실 행 됩 니 다.이것 은 JSP 와 ASP,PHP,PERL 등 스 크 립 트 언어 가 다른 점도 장점 중 하나 입 니 다.그러나 다 중 스 레 드 의 동기 화 문제 에 주의 하지 않 으 면 JSP 프로그램 에서 발견 하기 어 려 운 오류 가 발생 할 수 있 습 니 다.다음은 JSP 의 다 중 스 레 드 문제 와 해결 방법 을 예 로 들 어 설명 한다.1.JSP 에 존재 하 는 다 중 스 레 드 문제:클 라 이언 트 가 처음으로 JSP 파일 을 요청 할 때 서버 에서 이 JSP 를 CLASS 파일 로 컴 파일 하고 이러한 인 스 턴 스 를 만 든 다음 스 레 드 를 만들어 CLIENT 엔 드 의 요청 을 처리 합 니 다.여러 클 라 이언 트 가 이 JSP 파일 을 동시에 요청 하면 서버 에서 여러 스 레 드 를 만 듭 니 다.모든 클 라 이언 트 가 하나의 스 레 드 에 대응 할 것 을 요청 합 니 다.다 중 스 레 드 방식 으로 실행 하면 시스템 에 대한 자원 수 요 를 크게 낮 추고 시스템 의 병발 량 과 응답 시간 을 높 일 수 있 습 니 다.JSP 에서 사용 할 수 있 는 변 수 는 다음 과 같 습 니 다.
  • 인 스 턴 스 변 수 는 더미 에서 분배 되 고 이 인 스 턴 스 에 속 하 는 모든 스 레 드 에 의 해 공유 되 기 때문에 스 레 드 가 안전 하지 않 습 니 다.
  • JSP 시스템 이 제공 하 는 8 가지 변수 JSP 에서 사용 하 는 OUT 입 니 다.REQUEST,RESPONSE,SESSION,CONFIG,PAGE,PAGECONXT 는 스 레 드 가 안전 합 니 다.APPLICATION 은 전체 시스템 에서 사용 되 기 때문에 스 레 드 가 안전 하지 않 습 니 다.부분 변수 부분 변 수 는 스 택 에서 분 배 됩 니 다.모든 스 레 드 는 자신의 스 택 공간 이 있 기 때문에 스 레 드 가 안전 합 니 다.
  • 정적 류 정적 류 는 예화 되 지 않 아 도 됩 니 다.직접 사용 할 수 있 습 니 다.스 레 드 가 안전 한 것 도 아 닙 니 다.
  • 외부 자원:프로그램 에서 여러 스 레 드 나 프로 세 스 가 같은 자원 을 동시에 조작 할 수 있 습 니 다.(예 를 들 어 여러 스 레 드 나 프로 세 스 가 한 파일 을 동시에 작성 합 니 다)이때 도 동기 화 문제 에 주의해 야 합 니 다.
  • 2.다음 예 에 존재 하 는 다 중 스 레 드 문제:<%@page import="javax.naming.*,java.util.*,java.sql.*,weblogic.common.*" %> <%String nameString product;long  quantity;name=request.getParameter("name");product=request.getParameter("product");quantity=request.getParameter("quantity"); /*(1)*/savebuy();%><%!public void  savebuy(){    /*데이터 베 이 스 를 조작 하여 표 에 데 이 터 를 저장 합 니 다*/    try {      Properties props = new Properties();       props.put("user","scott");      props.put("password","tiger");      props.put("server","DEMO");        Driver myDriver = (Driver) iver").newInstance();      conn = myDriver.connect("jdbc:weblogic:oracle", props);      stmt = conn.createStatement();          String inssql = "insert into buy(empid, name, dept) values (?, ?, ?,?)";      stmt = conn.prepareStatement(inssql);       stmt.setString(1, name);      stmt.setString(2, procuct);         stmt.setInt(3, quantity);      stmt.execute();    }    catch (Exception e)     {        System.out.println("SQLException was thrown: " + e.getMessage());    }     finally //close connections and     {         try {          if(stmt != null)            stmt.close();          if(conn != null)            conn.close();        } catch (SQLException sqle) {            System.out.println("SQLException was thrown: " + sqle.getMessage());        }    }}%>위의 프로그램 은 인터넷 쇼핑 의 일부분 을 모 의 하여 사용자 가 브 라 우 저 에 입력 한 사용자 이름,구 매 한 물품 이름,수량 을 표 BUY 에 저장 합 니 다.savebay()함수 에 인 스 턴 스 변 수 를 사 용 했 기 때문에 스 레 드 가 안전 하지 않 습 니 다.프로그램 에 있 는 모든 문 구 는 원자 작업 이 아 닙 니 다.예 를 들 어 name=request.getParameter("name");실행 중 에는 여러 개의 기계 명령 에 대응 하여 언제든지 시스템 스케줄 링 으로 인해 수면 상태 로 전환 되 어 다른 스 레 드 가 계속 실 행 될 수 있 습 니 다.스 레 드 A 가(1)로 실 행 될 때 수면 상태 로 전환 되면 스 레 드 B 가 QUANTITY 의 값 을 실행 하고 변경 할 수 있 습 니 다.그러면 A 가 실 행 될 때 savebay()함수 호출 부터 실 행 됩 니 다.이렇게 하면 표 에 저 장 된 QUANTITY 는 스 레 드 B 에 의 해 변 경 된 값 입 니 다.그러면 스 레 드 A 에 대응 하 는 사용자 가 실제 구 매 한 수량 은 표 에 있 는 데이터 와 일치 하지 않 습 니 다.이것 은 매우 심각 한 문제 입 니 다.3.해결 방법
  • 은 단일 스 레 드 방식 으로 이 JSP 파일 에 추가 합 니 다.단일 스 레 드 방식 으로 실 행 됩 니 다.이때 도 하나의 인 스 턴 스 만 있 습 니 다.모든 클 라 이언 트 의 요청 은 직렬 로 실 행 됩 니 다.이렇게 하면 시스템 의 성능 을 떨 어 뜨 릴 수 있 습 니 다.
  • 함수 savebay()에 synchronized 를 추가 하여 스 레 드 동기 화 를 진행 합 니 다.이 JSP 는 여전히 다 중 스 레 드 방식 으로 실행 되 지만 시스템 의 성능 도 떨 어 집 니 다 Public synchronized void savebuy() {        ...... }
  • 은 인 스 턴 스 변 수 를 대체 하 는 부분 변 수 를 사용 합 니 다.함수 savebay()는 다음 과 같이 설명 합 니 다.savebay()에서 전 달 된 인삼 을 사용 하고 스 택 에서 분 배 된 것 이기 때문에 스 레 드 가 안전 합 니 다.public void savebay(String name,String product,int quantity){      ......}호출 방식:<%String nameString product;long quantity; name=request.getParameter("name");product=request.getParameter("product");quantity=request.getParameter("quantity"); savebay(name,product,quantity)%>savebay 의 인자 가 많 거나 이 데 이 터 를 여러 곳 에서 사용 해 야 한다 면 클래스 를 설명 하고 그 를 매개 변수 로 사용 할 수 있 습 니 다.예 를 들 어 Public class buyinfo{      String name;      String product;      long quantity;} public void savebuy(buyinfo info){      ......}호출 방식:<%buyinfo userbuy=new buyinfo();userbuy.name=request.getParameter("name");userbuy.product=request.getParameter("product");userbuy.quantity=request.getParameter("quantity"); savebuy(userbuy);%>
  • 따라서 3 을 사용 하 는 것 이 좋 습 니 다.1,2 는 시스템 의 성능 을 떨 어 뜨 릴 수 있 기 때 문 입 니 다.다 중 스 레 드 문 제 는 보통 큰 병발 량 으로 접근 할 때 만 발생 할 수 있 고 중복 되 기 어렵 기 때문에 프로 그래 밍 할 때 항상 주의해 야 합 니 다.

    좋은 웹페이지 즐겨찾기