Entries Tagged as JSP/Servlet

여러차례 소개한바 있지만 Querqus는 Java로 만들어진 PHP해석기이며 Resin으로 유명한 Caucho에서 개발배포하고 있습니다. 일반적으로 웹호스팅 환경에서는 네이티브PHP와 JSP/Servlet를 위한 서블릿엔진(Tomcat, Resin 등등)을 따로 설치하여 제공하여 어느 언어던지 이용하는데 불편함은 없지만 같은 환경에서 사용할 수 있더라도 둘다 같은 Java기반으로 돌아간다면 세션공유 등의 잇점이 있습니다.

많은 장점에도 불구하고 네이티브 PHP만큼 확실하게 지원되지 않거나 차이가 나는 점 때문에 Querqus를 지원하는 PHP웹어플리케이션이 국내에서는 전무하다시피 합니다. 가령 MySQL연결도 네이티브PHP는 함수로 연결하는 반면, QUerqus를 통해 Java기반으로 서비스한다면 JDBC를 통해 연결하는 등 약간씩의 방식적인 차이가 있으니까요.

Railo와 같은 ColdFusion도 역시나 Java기반의 엔진들이이기에 Querqus도 그것들처럼 적용하면 ColdFusion와 PHP, JSP를 하나의 단일 서버에서 단일 WAS로 서비스하는 (그래서 세션까지도 공유해버리는) 시나리오가 가능해 집니다.

Railo Express는 빠른 실행을 목적으로 개발시 유용한 도구 또는 내부 인트라용으로 사용되기 위한 버전입니다. Railo Server가 Tomcat을 내장하고 있다면 Railo Express는 Jetty를 내장하고 있습니다. (Railo 3.X초반대의 버전에서는 둘다 Resin을 사용하기도 했습니다.)

간단하게 Railo Express에 Querqus를 적용해 봅시다.  먼저 Railo Express를 다운로드 합니다. 여기서는 Windows환경에서 테스트하지만 Linux나 Mac에서도 동일하게 적용됩니다.

Railo Express 다운로드 : http://www.getrailo.org/index.cfm/download/ 
(현재 최신버전은 railo-express-4.0.3.006-jre-win32.zip)

Railo Express의 압축을 풀고 start.bat파일을 더블클릭하여 브라우저에서 http://127.0.0.1:8888 를 접속하여  정상 실행되는지 확인합니다.

Querqus 다운로드 : http://quercus.caucho.com/ 
(현재 최신버전은 Quercus 4.0.25입니다.)

이제 Querqus를 다운드하여 war파일을 압축유틸리티(7zip 등)로 압축을 풀고, quercus-4.0.25\WEB-INF\lib안의 다음 4가지 파일을 복사하여 railo-express-4.0.3.006-jre-win32\lib\ext 폴더안에 복사해 줍니다.   

cdi-16.jar
javaee-16.jar
javamail-141.jar
resin.jar

위 파일들을 복사한 후 Railo Express에 환경설정을 추가해 줍니다. 서블릿매핑(Servlet Mapping)를 해줘야 하는데요. railo-express-4.0.3.006-jre-win32\etc안의 webdefault.xml 파일을 수정합니다. 이 파일을 메모장 등으로 열고 다음의 코드를 Railo Definitions End 부분 바로 위에 추가해 줍니다. 위치는 크게 상관없지만 보기좋게 MessageBrokerServlet 바로 다음에 넣어두도록 합시다. 

railo-express-4.0.3.006-jre-win32\etc\webdefault.xml 

  <servlet-mapping>
    <servlet-name>MessageBrokerServlet</servlet-name>
    <url-pattern>/flex2gateway/*</url-pattern>
    <url-pattern>/flashservices/gateway/*</url-pattern>
    <url-pattern>/messagebroker/*</url-pattern>
  </servlet-mapping>
  
  <!--  Resin Quercus Servlet를 추가합니다. -->
  <servlet id="Quercus Servlet">
    <description>Quercus Servlet</description>
    <servlet-name>Quercus Servlet</servlet-name>
    <servlet-class>com.caucho.quercus.servlet.QuercusServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>Quercus Servlet</servlet-name>
    <url-pattern>*.php</url-pattern>
  </servlet-mapping> 
  <!--  Resin Quercus Servlet를 추가합니다. -->	
  
  <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
  <!--                                                 Railo Definitions End -->  
  <!-- ===================================================================== -->
  <!-- _____________________________________________________________________ -->

그리고 webdefault.xml 파일을 좀 아래로 내려서 <welcome-file-list>에도 다음의 코드를 추가합니다.

  <welcome-file-list>
    <welcome-file>index.cfm</welcome-file>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
	<!-- index.php를 추가합니다. -->
	<welcome-file>index.php</welcome-file>
    <!-- welcome-file>index.jsp</welcome-file !-->
  </welcome-file-list>

자, 이제 마지막으로 railo-express-4.0.3.006-jre-win32\webapps\railo안에 index.php 파일을 하나 만듭시다. 간단하게 phpinfo()를 만들어서 http://127.0.0.1:8888/index.php 로 접속했을때 아래와 같은 그림이 나온다면 이제 PHP를 실행할 수 있습니다.  

참조 : http://blog.fedecarg.com/2009/01/04/running-quercus-in-jetty-web-server/

Railo 4.0을 얼마전에 설치하고 나서 약간은 황당한 경우가 있었습니다. Railo 4.0을 설치한 후 다음과 같은 ColdFusion코드를 실행해 보면, 분면 제가 접속한 IP주소가 나타나야 하는데 항상 127.0.0.1으로 표기되는 황당한 사건이 발생한거죠. 어떤 IP에서 접속해도 늘 127.0.0.1으로 보이는 겁니다. 

<cfoutput>#CGI.REMOTE_ADDR#</cfoutput>

원인을 찾기위해 검색을 해본 결과 Tomcat 7에 문제가 있는것 같습니다.(참조 : https://groups.google.com/forum/?fromgroups=#!topic/railo/U9TSv3L4j94) 원인이 여러원인이 될 수 있다고 합니다만, 다음과 같이 해결할 수 있습니다. 

먼저, Railo의 설치경로 일반적으로 설치했다면, /opt/railo/tomcat/conf/web.xml 파일을 vi로 열어 맨 마지막줄 </web-app>바로 위해 다음의 코드를 넣어줍니다. 그런 다음 Railo를 Restart해 줍니다. 다시 위의 ColdFusion 코드를 실행하면 정상적으로 원격 접속 IP주소를 가져옵니다.

<filter>
	<filter-name>RemoteIpFilter</filter-name>
	<filter-class>org.apache.catalina.filters.RemoteIpFilter</filter-class>
</filter>

<filter-mapping>
	<filter-name>RemoteIpFilter</filter-name>
	<url-pattern>/*</url-pattern>
	<dispatcher>REQUEST</dispatcher>
</filter-mapping>

한가지 팁 ! Railo 4.0을 설치한 후 JSP를 같이 사용하고 싶다면? 여기서는 Railo 4.0 Linux Server 버전을 설치했다고 가정하고 설명드리면.. Railo에서는 기본적으로 JSP가 활성화되어 있습니다만, 초기 설치시 Installer가 Apache웹서버와 연동을 해줄때 Apache 환경설정 파일에 다음과 같은 코드를 자동으로 넣어주는데, 여기서 JSP에 해당되는 주석 한줄을 추가해 줍니다. (주석처리된 한줄만 추가하면 됩니다.) 그런다음 Apache의 DirectoryIndex의 항목에 index.jsp를 추가해 주면되겠죠? 물론 Apache를 재시작해 주어야 합니다.

<IfModule mod_proxy.c>
<Proxy *>
Allow from 127.0.0.1
</Proxy>
ProxyPreserveHost On
ProxyPassMatch ^/(.+\.cf[cm])(/.*)?$ http://127.0.0.1:8888/$1$2
ProxyPassMatch ^/(.+\.cfchart)(/.*)?$ http://127.0.0.1:8888/$1$2
ProxyPassMatch ^/(.+\.cfres)(/.*)?$ http://127.0.0.1:8888/$1$2
ProxyPassMatch ^/(.+\.cfml)(/.*)?$ http://127.0.0.1:8888/$1$2
###아래의 한줄을 추가해 줍니다.##############################
ProxyPassMatch ^/(.+\.jsp)(/.*)?$ http://127.0.0.1:8888/$1$2
#############################################################
# optional mappings
#ProxyPassMatch ^/flex2gateway/(.*)$ http://127.0.0.1:8888/flex2gateway/$1
#ProxyPassMatch ^/messagebroker/(.*)$ http://127.0.0.1:8888/messagebroker/$1
#ProxyPassMatch ^/flashservices/gateway(.*)$ http://127.0.0.1:8888/flashservices/gateway$1
#ProxyPassMatch ^/openamf/gateway/(.*)$ http://127.0.0.1:8888/openamf/gateway/$1
#ProxyPassMatch ^/rest/(.*)$ http://127.0.0.1:8888/rest/$1
ProxyPassReverse / http://127.0.0.1:8888/
</IfModule>

기존에 JSP나 Servlet으로 구축된 어떤 시스템이 있다고 가정해 봅시다. 이 시스템은 워낙 방대하고 복잡해서 전면적인 개편이나 신규구축이 어렵다고 합니다. 그런데 ColdFusion의 강력한 기능과 효율적인 개발환경을 도입하고자 합니다. 상이한 두 환경과 이질적인 웹어플리케이션간의 통합을 어떻게 해야 할까요?

어려 방법이 있겠습니다만, 가장 우선 두 이질적인 웹어플리케이션을 통합하는데 있어 중요한 것은 데이터베이스와 파일의 기본적인 환경 공유와 함께 사용자인증, 어플리케이션 인증 등을 위해 세션(Session)을 공유해야 정확한 의미에서 "통합"이라는 단어를 쓸 수 있겠죠.

가령, PHP로 구축된 어떤 어플리케이션과 ASP로 구축된 어떤 어플리케이션을 단일호스트(웹사이트환경)에서 모두 실행 할 수는 있겠죠. Windows 시스템에 IIS웹서버를 사용하고, PHP를 별도로 추가 설치한 후 IIS에 매핑을 해주면 되니까요. 두 언어 모두 MSSQL이나 Oracle 또는 MySQL에 접근하는 방식만 다를 뿐 기존 데이터베이스를 얼마든지 이용가능합니다.

그런데 ASP로 구축된 회원로그인과 같은 기능은 PHP와 통합하기 어렵죠. ASP에서 인증을 처리하고 세션을 생성해도 PHP에서는 가져다 쓸 수 없으니까요. 약간의 꼼수로 ASP세션을 파일이나, DB에 넣어두고 PHP가 그때 참조하도록 조치할 수 있겠지만 복합한 비지니스 환경에서 보안적 위협을 무릎쓰고 그렇게 할 수 는 없는 노릇입니다.

반대로 PHP와 ColdFusion, 또는 PHP와 JSP는 어떨까요? 한가지 확실한건 Resin을 만든 Caucho의 Quercus와 같은 Java로 만들어진 PHP해석기 때문에 PHP로 만들어진 웹어플리케이션이 Quercus에서 구동이 보장되는 호환성만 갖추었다면 J2EE기반의 어떤 언어 가령 JSP나 ColdFusion과는 Session 데이터를 서로 공유할 수 있습니다. 물론 ColdFusion 중 BlueDragon이란 .NET기반으로 만들어진 WAS을 사용한다면 닷넷과도 공유는 가능할 지 모르겠습니다.

이질적인 언어들간의 세션공유는 보안적측면을 떠나서 메모리상에서만 존재하는 데이터에 대한 상호공유의 문제이므로 완벽한 통합과 관련이 깊다고 생각됩니다. 오늘은 JSP와 ColdFusion사이에 어떻게 세션을 공유하는지 알아보려 합니다.

ColdFusion은 잘 아시다시피 J2EE기반으로 만들어진 WAS입니다. Tomcat과 같은 Servlet부터, Resin, Glashfish, Jboss, Weblogic 등등 대부분의 J2EE기반의 WAS에 통합되어 사용됩니다. 따라서 설정의 문제이지 기본적으로 JSP를 구동할 수 있는 환경이 자동으로 조성됩니다.

문제는 단독으로 JSP나 또는 ColdFusion을 사용하는 경우라면 문제가 없겠지만 기존의 JSP/Servlet기반의 어플리케이션에 ColdFusion을 도입하려 한다면 기존의 J2EE WAS에 단순히 ColdFusion의 여러 제품들 가령, Adobe ColdFusion이나 Railo, Open BlueDragon 같은 것을 Deploy하기만 하면 됩니다.

문제는 ColdFusion을 Deploy하여 JSP와 ColdFusion을 단일 J2EE WAS내에서 구동되게 하였어도 Session이 통합되지 않으면 로그인 인증처리 등등에서 문제가 생길 수 있습니다. 

자, 먼저 JSP에서 세션을 생성하고 그 세션을 ColdFusion에서 가져와 봅시다. JSP세션이 살아있는 동안은 ColdFusion에서 참조할 수 있지요. 여기서 몇가지, 우선 JSP세션을 가져와서 단순히 이용만할 것인지(JSP세션이 사라지면 ColdFusion에서도 참조할 수 없음) 아니면 JSP세션을 가져와서 ColdFusion내에서 세션을 한번 더 생성하여 JSP세션의 존재유무와 상관없이 ColdFusion에서는 생성된 세션을 계속 이용하는지의 여부를 생각할 수 있습니다. 어떠한 경우든 상관없이 문제는 생성되는 JSP세션을 ColdFusion이 정확하게 인식해야 한다는 것 입니다.

잠시 예제 화면을 보죠. (예제보기 - 이 예제는 추후 접속이 불가능할 수 있습니다.)

JSP ColdFusion Session Sharing
<JSP의 세션이 아지 생성되지 않은 화면>

JSP ColdFusion Session Sharing
<JSP에서 생선된 세션을 ColdFusion에서 가져온 화면>

 

먼저, 세션의 유무를 확인하는 소스코드가 들어간 첫페이지(index.jsp)를 살펴봅니다. 소스코드 참조.

 

index.jsp

<%@page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>

<% 
	String myStr;
	if(session.getAttribute("myVar")!=null) {
		myStr=(String)session.getAttribute("myVar");
	} else {
		myStr="세션값 없음";
	}
%>

세션값 : <%=myStr%>

 

그리고 세션을 생성하는 jsp파일(create_session.jsp)와 세션을 제거하는 jsp파일(remove_session.jsp)의 소스코드를 살펴보세요.

 

create_session.jsp

<%@page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>

<% session.setAttribute("myVar", "JSP가 만든 세션");%>

 

 

remove_session.jsp

<%@page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>

<% session.invalidate();%>

 

마지막으로 ColdFusion에서는 다음과 같이 JSP가 생성한 세션을 가져올 수 있습니다. JSP세션이 파괴되면 아무런 값을 가져올 수 없습니다. JSP세션주기에 따라 ColdFusion에서 어플리케이션을 제어할 수 있게되는 셈인데, JSP세션이 생성되고 (만약 이 세션이 정상적인 로직에 의해 생성된 것이라면) ColdFusion에서 이를 확인한 후 다시, ColdFusion내에서 같은 값으로 ColdFusion세션을 생성하여 활용할 수도 있겠죠? 다만 이 경우엔 JSP의 세션주기와는 무관하게 작동하므로 이를 주의할 필요는 있어 보입니다.

기본적으로 ColdFusion에서는  GetPageContext().include("hello.jsp"); 와 같이 JSP페이지를 인클루드할 수 있습니다. 이때 세션정보도 같이 인클루드 되므로 JSP에서 세션이 생성되지 않았다면 이 코드가 실행되는 ColdFusion페이지에는 세션정보가 전달되지 않습니다. 하지만 이렇게 인클루드할 경우 JSP파일을 인클루드하는 ColdFusion페이지를 제어하기 약간은 곤란합니다.(경험상 보면 JSP세션이 생성된 경우 세션값이 그대로 노출.) 따라서 다음과 같이 ColdFusion에서 JSP세션을 가져오는 것이 안전합니다.

 

get_jsp_session.cfm

<!--- Java객체생성 --->
<cfset htreq=createObject("java","javax.servlet.http.HttpServletRequest")>
<cfset htsess=createObject("java","javax.servlet.http.HttpSession")>
<cfset jumap=createObject("java","java.util.Map")>

<!--- 세션가져오기 --->
<cfset htreq = GetPageContext().getRequest()>
<cfset htsess = htreq.getSession()>
<cfset jumap = htsess.getAttribute("myVar")>

<!---세션값 출력 --->
<cfoutput>#jumap#</cfoutput>

 

어떤가요? 뭐 JSP나 ColdFusion을 모르시는 분들이야 이게 뭔소리래? 하시겠지만 우선적으로 동일한 J2EE기반의 이질적인 언어지만 같은 J2EE란 베이스를 가지고 있으므로 좀더 간결하고 쉽고 개발편의성을 제공하면서도 Java의 기능을 사용할 수 있는 ColdFusion으로 확장이 좀 쉬어지지 않을까 생각합니다. ^^

참조 : 

 

 

Powered by

© 2010-2018 NOOREE.COM