블로그 이미지
올해목표 // 10월 어학연수 떠나자~ 자수씨

카테고리

전체글 (1457)
Brand New! (28)
주절주절 (213)
MOT (11)
해외쇼핑 (49)
쇼핑노트 (150)
취미생활 (94)
iPhone (4)
Eclipse (121)
Google (83)
Spring (31)
JAVA (176)
JavaScript (59)
WEB (49)
Database (20)
OS (26)
Tools (8)
Tips (26)
IT정보 (1)
Book (21)
Programming (37)
외부행사 (43)
주변인들 (17)
여행노트 (60)
학교생활 (30)
회사생활 (52)
사회생활 (5)
외국어공부 (12)
잡동사니 (30)
Total
Today
Yesterday
 
01-07 08:49
 

달력

« » 2025.1
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
 

최근에 올라온 글

최근에 달린 댓글


웹 서비스 클라이언트를 가장 빨리 테스트 할 수 있는 방법은 이클립스에서 Apache Axis 를 이용한 클라이언트를 제너레이션 하여 테스트하는 것 입니다.

하지만 HTTP Authentication 인증 처리는 자동화해주지 않기 때문에 제너레이션된 소스에 별도의 수정이 필요합니다.

생성된 클래스 중 [ServiceName]Location.java 파일이 있을 것 입니다.
저의 경우에는 WorkflowWebServicesserviceName 이기 때문에 WorkflowWebServicesLocator.java 파일을 수정하였습니다.


getWorkflowWebServicesPort(java.net.URL portAddress) 메소드에서 생성된 stub 에 username 과 password 프로퍼티를 설정하는 것입니다.
_stub._setProperty(_stub.USERNAME_PROPERTY, "vicki");
_stub._setProperty(_stub.PASSWORD_PROPERTY, "vickivicki");

위와 같이 username 과 password 를 설정하면.... HTTP 인증 절차도 통과가 됩니다.

유후~~

오늘 웹 서비스만 너무 많이 파고 들어간거 같네요... 힘이 듭니다. 털썩...

Posted by 자수씨
, |

Tomcat, encoding 변경하기

JAVA / 2010. 4. 19. 14:03


$CATALINA_HOME/bin/catalina.sh 의 JAVA_OPTS 를 설정하는 부분을 수정합니다.
JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=EUC-KR"


맨날 까먹어서 정리...

Posted by 자수씨
, |

HTML 의 style 속성을 가지고 이리저리 만져볼 일이 생겨서 StyleSheet 라는 클래스를 만들어 보았습니다.


정규식을 이용하여 style 속성을 분리하여 Map 에 담아서 슥삭슥삭 합니다.


[테스트 코드]

[출력 결과]
style-name: 바탕글; margin-left: 0.0pt; margin-right: 0.0pt; margin-top: 0.0pt; margin-bottom: 0.0pt; text-align: justify; text-indent: 0.0pt; line-height: 160%; font-size: 10.0pt; font-family: 굴림; letter-spacing: -1.5pt; font-weight: normal; font-style: normal; color: #000000; 
 


쓰면서 슬슬 고쳐나가야 할 듯 합니다.

Posted by 자수씨
, |

아래와 같은 문서가 있습니다.
P.HStyle0, LI.HStyle0, DIV.HStyle0
 {style-name:"바탕글"; margin-left:0.0pt; margin-right:0.0pt; margin-top:0.0pt; margin-bottom:0.0pt; text-align:justify; text-indent:0.0pt; line-height:160%; font-size:10.0pt; font-family:바탕; letter-spacing:0.0pt; font-weight:"normal"; font-style:"normal"; color:#000000;}
P.HStyle1, LI.HStyle1, DIV.HStyle1
 {style-name:"본문"; margin-left:15.0pt; margin-right:0.0pt; margin-top:0.0pt; margin-bottom:0.0pt; text-align:justify; text-indent:0.0pt; line-height:160%; font-size:10.0pt; font-family:바탕; letter-spacing:0.0pt; font-weight:"normal"; font-style:"normal"; color:#000000;}
P.HStyle2, LI.HStyle2, DIV.HStyle2
 {style-name:"개요 1"; margin-left:10.0pt; margin-right:0.0pt; margin-top:0.0pt; margin-bottom:0.0pt; text-align:justify; text-indent:0.0pt; line-height:160%; font-size:10.0pt; font-family:바탕; letter-spacing:0.0pt; font-weight:"normal"; font-style:"normal"; color:#000000;}
P.HStyle3, LI.HStyle3, DIV.HStyle3
 {style-name:"개요 2"; margin-left:20.0pt; margin-right:0.0pt; margin-top:0.0pt; margin-bottom:0.0pt; text-align:justify; text-indent:0.0pt; line-height:160%; font-size:10.0pt; font-family:바탕; letter-spacing:0.0pt; font-weight:"normal"; font-style:"normal"; color:#000000;}
P.HStyle4, LI.HStyle4, DIV.HStyle4
 {style-name:"개요 3"; margin-left:30.0pt; margin-right:0.0pt; margin-top:0.0pt; margin-bottom:0.0pt; text-align:justify; text-indent:0.0pt; line-height:160%; font-size:10.0pt; font-family:바탕; letter-spacing:0.0pt; font-weight:"normal"; font-style:"normal"; color:#000000;}
P.HStyle5, LI.HStyle5, DIV.HStyle5
 {style-name:"개요 4"; margin-left:40.0pt; margin-right:0.0pt; margin-top:0.0pt; margin-bottom:0.0pt; text-align:justify; text-indent:0.0pt; line-height:160%; font-size:10.0pt; font-family:바탕; letter-spacing:0.0pt; font-weight:"normal"; font-style:"normal"; color:#000000;}
P.HStyle6, LI.HStyle6, DIV.HStyle6
 {style-name:"개요 5"; margin-left:50.0pt; margin-right:0.0pt; margin-top:0.0pt; margin-bottom:0.0pt; text-align:justify; text-indent:0.0pt; line-height:160%; font-size:10.0pt; font-family:바탕; letter-spacing:0.0pt; font-weight:"normal"; font-style:"normal"; color:#000000;}
P.HStyle7, LI.HStyle7, DIV.HStyle7
 {style-name:"개요 6"; margin-left:60.0pt; margin-right:0.0pt; margin-top:0.0pt; margin-bottom:0.0pt; text-align:justify; text-indent:0.0pt; line-height:160%; font-size:10.0pt; font-family:바탕; letter-spacing:0.0pt; font-weight:"normal"; font-style:"normal"; color:#000000;}
P.HStyle8, LI.HStyle8, DIV.HStyle8
 {style-name:"개요 7"; margin-left:70.0pt; margin-right:0.0pt; margin-top:0.0pt; margin-bottom:0.0pt; text-align:justify; text-indent:0.0pt; line-height:160%; font-size:10.0pt; font-family:바탕; letter-spacing:0.0pt; font-weight:"normal"; font-style:"normal"; color:#000000;}
P.HStyle9, LI.HStyle9, DIV.HStyle9
 {style-name:"쪽 번호"; margin-left:0.0pt; margin-right:0.0pt; margin-top:0.0pt; margin-bottom:0.0pt; text-align:justify; text-indent:0.0pt; line-height:160%; font-size:10.0pt; font-family:굴림; letter-spacing:0.0pt; font-weight:"normal"; font-style:"normal"; color:#000000;}
P.HStyle10, LI.HStyle10, DIV.HStyle10
 {style-name:"머리말"; margin-left:0.0pt; margin-right:0.0pt; margin-top:0.0pt; margin-bottom:0.0pt; text-align:justify; text-indent:0.0pt; line-height:150%; font-size:9.0pt; font-family:굴림; letter-spacing:0.0pt; font-weight:"normal"; font-style:"normal"; color:#000000;}
P.HStyle11, LI.HStyle11, DIV.HStyle11
 {style-name:"각주"; margin-left:13.1pt; margin-right:0.0pt; margin-top:0.0pt; margin-bottom:0.0pt; text-align:justify; text-indent:-13.1pt; line-height:130%; font-size:9.0pt; font-family:바탕; letter-spacing:0.5pt; font-weight:"normal"; font-style:"normal"; color:#000000;}
P.HStyle12, LI.HStyle12, DIV.HStyle12
 {style-name:"미주"; margin-left:13.1pt; margin-right:0.0pt; margin-top:0.0pt; margin-bottom:0.0pt; text-align:justify; text-indent:-13.1pt; line-height:130%; font-size:9.0pt; font-family:바탕; letter-spacing:0.5pt; font-weight:"normal"; font-style:"normal"; color:#000000;}
P.HStyle13, LI.HStyle13, DIV.HStyle13
 {style-name:"메모"; margin-left:0.0pt; margin-right:0.0pt; margin-top:0.0pt; margin-bottom:0.0pt; text-align:justify; text-indent:0.0pt; line-height:160%; font-size:9.0pt; font-family:굴림; letter-spacing:0.5pt; font-weight:"normal"; font-style:"normal"; color:#000000;}

여기에서 P 스타일의 이름과 속성들을 개별적으로 뽑으려면 어떻게 할까요?

P.HStyle0, LI.HStyle0, DIV.HStyle0
 {style-name:"바탕글"; margin-left:0.0pt; margin-right:0.0pt; margin-top:0.0pt; margin-bottom:0.0pt; text-align:justify; text-indent:0.0pt; line-height:160%; font-size:10.0pt; font-family:바탕; letter-spacing:0.0pt; font-weight:"normal"; font-style:"normal"; color:#000000;}

예를 들면, 위의 내용으로 아래의 데이터를 뽑아내는 것 입니다.

{ styleName: "HStyle0", style: "style-name:\"바탕글\"; margin-left:0.0pt; margin-right:0.0pt; margin-top:0.0pt; margin-bottom:0.0pt; text-align:justify; text-indent:0.0pt; line-height:160%; font-size:10.0pt; font-family:바탕; letter-spacing:0.0pt; font-weight:"normal"; font-style:\"normal\"; color:#000000;" }




정규식만 잘 이용하면 CSS 파서 만드는 것도 어렵지 않을 것 같네요~
그 잘 이용하는게 어려울 뿐이죠...



Posted by 자수씨
, |

원본           : (2010. 03. 20.)
추출 데이터 : 2010-03-20

어떤 방법으로 해당 데이터를 추출할 수 있을까요?





Posted by 자수씨
, |

HTML 을 XML 파서로 파싱해서 객체화 시킬 일이 있어 여러 가지 실험해 보다가 쓸만한 팁을 정리합니다.

HTML 의 경우는 XML 과는 다르게 태그를 닫지 않거나 attribute 를 큰 따옴표로 감싸지 않아도 브라우저에서 확인이 가능합니다. 이렇기 때문에 HTML 을 XML 파서로 파싱하려면 큰 따옴표로 묶이지 않은 부분을 변경해 주어야 합니다.
(실제로 작업을 해보지는 않았으나 태그를 닫지 않는 것을 수정하려면 문서 전체를 문자열 단위로 파싱을 해야 가능할 것 같습니다.)

[TYPE_A]
<P class=PStyle0>
...
</P>

[TYPE_B]
<P class="PStyle0">
...
</P>

간단하게 이야기 하자면 [TYPE_A][TYPE_B] 로 변경하는 것이 목적입니다.

자바에서는 replaceAll 메소드와 정규식을 이용하면 쉽게 변환이 가능합니다.


우선 replaceAll 의 첫번째 파라미터를 설명하겠습니다.
'class='로 시작을 하고 스페이스, '>', 큰 따옴표가 나오기 전까지의 모든 문자들의 연속을 찾습니다. 괄호로 묶음은 그룹을 뜻하는데 여기서 그룹 1 은 'class=' 이며, 그룹 2 는 위의 [TYPE_A] 에서 라면 'PStyle0' 까지 입니다.

두번째 파라미터는 간단합니다. '$그룹번호' 로 변경하겠다는 이야기 입니다.
'$1\"$2\"' 을 단계별로 변환하면 그룹 1 이 교체되면 'class=\"$2\"' 가 되고 그룹 2 가 교체되면 'class=\"PStyle0\"' 이 됩니다.

정규식은 역시 활용만 잘하면 단순 노가다 작업을 간단하게 줄여줄 수 있는 강력한 무기가 됩니다.


Posted by 자수씨
, |

맨날 jdbc 로 DB 에 연결할 때는 아래와 같이 간단한 url 로 접속을 하였습니다.
jdbc:oracle:thin:@[HOST]:1521:[SID]


최근 프로젝트를 하면서 늦게까지 남아있었다는 죄로... DB 쪽 설정을 만지게 되었는데, 이번에는 RAC 로 구성되어 있는 것을 보았습니다. RAC 구성을 통해 로드 밸런싱과 fail over 설정도 가능하였습니다.
jdbc:oracle:thin:@(DESCRIPTION =(ADDRESS =(PROTOCOL = TCP)(HOST = [HOST1])(PORT = 1521))(ADDRESS =(PROTOCOL = TCP)(HOST = [HOST2])(PORT = 1521))(LOAD_BALANCE = OFF)(FAILOVER = ON)(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = [Service Name])))


RAC 구성과는 다르게 프로젝트 하는 환경에서는 스캔 아이피를 이용하였습니다.
하드웨어적으로 로드 밸런싱과 fail over를 지원하는 것으로 생각되네요...
jdbc:oracle:thin:@[span ip host]:1521/[service name]


스캔 아이피로 붙을 경우 요즘 나온 클라이언트들로는 어떻게 붙는지 몰라서... 그냥 RAC 구성으로만 테스트 하고 있습니다.

오라클을 잘 모르는 분야이므로 이정도만 정리~







Posted by 자수씨
, |

CasValidationFilter 를 Cas20ProxyReceivingTicketValidationFilter 로 테스트 했을 때, principal.getAttributes() 가 null 로 반환되어 어쩔 수 없이 Saml11TicketValidationFilter 를 사용하였습니다.

오늘 CAS Client 설정 메뉴얼을 작성하면서 Cas20ProxyReceivingTicketValidationFilter 로 설정하도록 한 것 때문에 같이 연동을 했던 분이 attributes 를 가지고 올 수 없었습니다.
당근 아저씨한테 물어보니 맨 처음 썼던 것 처럼 null 로 반환되는 문제 때문에 SAML로 하셨다고 하네요...

혹시 무언가 방법이 있을 것 같아 찾아보니 아래와 같은 방법이 있었습니다.

http://www.ja-sig.org/issues/browse/CAS-655

위의 방법은 CAS Server 의 /WEB-INF/view/jsp/protocol/2.0/casServiceValidationSuccess.jsp 파일을 수정하는 것이었습니다.
<%@ page pageEncoding="UTF-8"%><%@ page session="false" %><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %><cas:serviceResponse xmlns:cas='http://www.yale.edu/tp/cas'>
 <cas:authenticationSuccess>
  <cas:user>${fn:escapeXml(assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.id)}</cas:user>
  <cas:attributes>
   <c:forEach var="attr"
    items="${assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.attributes}"
    varStatus="loopStatus" begin="0"
    end="${fn:length(assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.attributes)-1}"
    step="1"><cas:${fn:escapeXml(attr.key)}>${fn:escapeXml(attr.value)}</cas:${fn:escapeXml(attr.key)}>
   </c:forEach>
  </cas:attributes>

<c:if test="${not empty pgtIou}">
  <cas:proxyGrantingTicket>${pgtIou}</cas:proxyGrantingTicket>
</c:if>
<c:if test="${fn:length(assertion.chainedAuthentications) > 1}">
  <cas:proxies>
<c:forEach var="proxy" items="${assertion.chainedAuthentications}" varStatus="loopStatus" begin="0" end="${fn:length(assertion.chainedAuthentications)-2}" step="1">
   <cas:proxy>${fn:escapeXml(proxy.principal.id)}</cas:proxy>
</c:forEach>
  </cas:proxies>
</c:if>
 </cas:authenticationSuccess>
</cas:serviceResponse>
해당 파일을 열고 붉은 부분을 추가합니다. pageEncoding 은 해당 서버의 charset 에 맞게 설정합니다.



잘 나오는 것을 확인하였습니다. 일단 CAS 2.0 protocol 을 사용하는 것이 옵션도 많아서 일단은 이걸로 쭉~ 가볼 생각입니다.


Posted by 자수씨
, |
...
<Status><StatusCode Value="samlp:Success"></StatusCode></Status>
...

Response SAML에서는 저런식으로 Success가 나오는데...

javax.servlet.ServletException: org.jasig.cas.client.validation.TicketValidationException: No valid assertions from the SAML response found.
클라이언트에서 로그인할 때 저런 메시지가 나온다면...

CAS 서버나 클라이언트의 시간을 확인해보시면 됩니다.
서버 시간이 클라이언트 시간보다 말도 안되게 느리면 나오는 문제입니다.


지난 번에 당근아저씨가 겪언던 문제라 1시간만 삽질하고 해결!!!


tolerance 가 작게 잡혀 있으면 서버시간 보다 클라이언트 시간이 조금만 느려도... 문제가 발생하네요...

쩝;;;


Posted by 자수씨
, |

http://www.ja-sig.org/downloads/cas-clients/php/ 에서 최신버전 phpCAS 모듈을 내려받습니다.

CAS-[버전] 디렉토리 밑에 CAS, docs 디렉토리와 CAS.php 파일을 해당 php 프로젝트 루트에 붙여넣습니다.

include 페이지 수정

해당 로직을 include 페이지 상단에 삽입합니다. (서버 설정에 따라 붉은 볼드 부분은 변경될 수 있습니다.)

<?php

 

//

// phpCAS simple client

//

 

// import phpCAS lib

include_once('CAS.php');

 

phpCAS::setDebug();

 

// initialize phpCAS

phpCAS::client(CAS_VERSION_2_0,'sso-cas.univ-rennes1.fr',443,'');

 

// no SSL validation for the CAS server

phpCAS::setNoCasServerValidation();

 

// force CAS authentication

phpCAS::forceAuthentication();

 

// at this step, the user has been authenticated by the CAS server

// and the user's login name can be read with phpCAS::getUser().

 

// logout if desired

if (isset($_REQUEST['logout'])) {

        phpCAS::logout();

}

 

// for this test, simply print that the authentication was successfull

?>


Web Application
을 재 시작하여 CAS Login 페이지가 나오게 되면 정상입니다.

참고자료: http://www.ja-sig.org/wiki/display/CASC/phpCAS



Posted by 자수씨
, |

글 보관함

최근에 받은 트랙백