XSS.pdf


XSS 및 SQL Injection 관련 패턴

Posted by 나랑살자

댓글을 달아 주세요

[jboss@yellow moms]$ crontab -e


#mom's

15 01 * * * cd /home/jboss/moms;sh momsdiary.sh <id> <pwd>


[jboss@yellow moms]$ cat momsdiary.sh 

#!/bin/bash +



if [ $# -ne 2 ] ; then

echo "Usage: $0 <id> <passwd>"

exit 1

fi


LOG_DIR=./logs/$(date +'%Y%m')

mkdir -p $LOG_DIR

USERID=$1

PASSWD=$2


touch "$LOG_DIR/$(date +%Y%m%d%H%M%S).start"


POST_DATA="id=$USERID&password=$PASSWD"


set +

wget \

--user-agent="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)" \

--keep-session-cookies \

--save-cookie cookie \

--post-data $POST_DATA \

--secure-protocol=SSLv2 \

--no-check-certificate \

-o result.momsdiary.co.kr.system \

-O result.momsdiary.co.kr.out \

https://secure.momsdiary.co.kr/member/login.php 


HTTP_RESULT=`grep '200 OK' result.momsdiary.co.kr.system | awk '{print $6}'`

echo $HTTP_RESULT

if [ "e200" != "e$HTTP_RESULT" ] ; then

touch "$LOG_DIR/$(date +%Y%m%d%H%M%S).error"

rm result.*

exit 1;

fi


YEAR=`date +'%Y'`

MONTH=`date +'%m'`

DAY=`date +'%d'`

POST_DATA="mlog_id=$USERID&reg_date=$YEAR-$MONTH-$DAY&vtype=&mode=write&diary_kind=1&category=01&diary_year=$YEAR&diary_month=$MONTH&diary_day=$DAY&weather=09&emoticon=10&title=$YEAR/$MONTH/$DAY diary&align=left&comment=$YEAR/$MONTH/$DAY diary&open=0&best=0&picture=&x=0&y=0

"


wget \

--user-agent="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)" \

--load-cookies cookie \

--post-data "$POST_DATA" \

--referer="http://mlog.momsdiary.co.kr/mydiary/diary/index.html?mlog_id=badagi&mode=write" \

-o result.data1.momsdiary.co.kr.system \

-O result.data1.momsdiary.co.kr.out \

http://data1.momsdiary.co.kr/mydiary/diary/diary_act_2011.php 


rm result.*


touch "$LOG_DIR/$(date +%Y%m%d%H%M%S).done"

Posted by 나랑살자

댓글을 달아 주세요

Amazon EC2의 제한점이라면 EC2 인스턴스의 동일본이 다른 지역으로 복사가 안된다는 점입니다.


아래와 같이 여러 많은 방법들이 소개되고 있다. 스크립트도 쓰고, 별의 별 방법을 다 동원하고 있지만 접근하기는 쉽지가 않습니다.


http://alestic.com/2010/10/ec2-ami-copy 


http://blog.ibd.com/scalable-deployment/copy-an-ebs-ami-image-to-another-amazon-ec2-region/ 



간단한 방법으로 인스턴스의 이미지를 다른 지역으로 복사하는 방법을 설명합니다.


1. 먼저 현재 EBS 또는 S3 형태의 볼륨보다 큰 EBS 볼륨을 관리콘솔에서 생성하여 복사할 EC2인스턴스에 attach시킵니다.


[root@ip-10-224-114-237 ~]# df -h

Filesystem            Size  Used Avail Use% Mounted on

/dev/sda1              30G  4.0G   25G  15% /

tmpfs                 308M     0  308M   0% /dev/shm



위의 파일 시스템을 보면 30G 짜리의 /dev/sda1으로 root가 mount되어 있습니다. 


2. 위의 루프파일 시스템보다 큰 크기인 40G 정도의 볼륨을 생성하여 마운트 시킵니다.

$> mkfs -t ext3 /dev/sdg

$> mkdir -p /mnt/sdg

$> mount -t ext3 /dev/sdg /mnt/sdg


3. 마운트가 끝나면 현재의 루프파일 시스템을 dd명령을 이용하여 mnt/sdg에 생성한 후 압축합니다.

$> dd if=/dev/sda1 of=/mnt/sdg/template bs=10M

$> tar -zcvf template.tar.gz /mnt/sdg/template


4. 아마존 콘솔을 이용하여 대상지역(target region)에 EC2 인스턴스를 micro로 생성합니다. 생성 후 위의 /dev/sda1과 동일한 크기의 EBS를 생성하여 신규 시스템에 attach 시킵니다.

위의 예에서는 30G짜리의 EBS를 사용했으므로 동일하게 30G짜리를 생성합니다.

$> mkfs -t ext3 /dev/sdg

$> mkdir -p /mnt/sdg

$> mount -t ext3 /dev/sdg /mnt/sdg



5. Source측의 압축된 template.tar.gz파일을 #4에서 생성된 인스턴스로 scp를 사용하여 전송합니다.

$> chmod 600 target-region.pem

$> scp -i target-region.pem  template.tar.gz root@ec2-176-34-228-119.eu-west-1.compute.amazonaws.com:~/



6. 대상지역에서 template.tar.gz의 압축을 푼 후, dd명령을 이용하여 attach된 볼륨에 template을 복제합니다.

$> tar -zxvf template.tar.gz

#> dd if=template of=/dev/sdg bs=10M


7. 위의 /dev/sdg의 마운트를 해제합니다.

$> umount /dev/sdg


8. 아마존 콘솔에서 해당 EBS 볼륨에 대한 스냅샷을 생성합니다.

아마존 콘솔(Amazon Console) -> Volume -> Create snapshot


9. EC2 command line tool을 이용하여 해당 스냅샷을 이용한 인스턴스를 생성합니다.

http://docs.amazonwebservices.com/AWSEC2/latest/CommandLineReference/ApiReference-cmd-RegisterImage.html


linux-box-source:~/ec2-api-tools-1.4.2.4$ ./bin/ec2-register --private-key pk-your.pem --cert cert-your.pem -v -H --region eu-west-1 -a  x86_64 -s snap-a485f7cc  -d 'CopyAMI Generated' -n 'AMI_DESCRIPTION' --root-device-name /dev/sda1 --kernel aki-5f7f552b



명령어 입력전에 ec2-api-tool이 반드시 설치되어 있어야 한다. 커널 아이디 'aki-5f7f552b'는 OEL5.5의 기본 커널 아이디이며, snap-a485f7cc 는 위에서 생성된 스냅샷, 대상 지역은 복사하고자 하는 위치입니다.



위의 private-key와 cert-key는 Amazon Console의 오른쪽 위의 Security Credentials의 CREDENTIALS의 X.509 탭을 누르면 나오는 "CREATE A NEW CERTIFICATE" 버튼을 눌러 나타나는 키를 다운받습니다.


10. 생성이 완료되면 아마존 콘솔에서 대상지역의 AMI를 보면 방금 생성한 AMI가 보일것이다.

생성된 AMI를 이용하여 인스턴스를 launch합니다.


11. 아마존 인스턴스의 경우 swap은 복사되지 않으므로 새로운 swap volume을 생성하여 인스턴스에 attach한 후 스왑을 만들어줘야 합니다.


fdisk /dev/sdf

          Command (m for help): n

          Command action

             e   extended

             p   primary partition (1-4)

          p

          Partition number (1-4): 1

          First cylinder (1-1044, default 1): 

          Last cylinder or +size or +sizeM or +sizeK (1-1044, default 1044): 

          

          Command (m for help): t

          Selected partition 1

          Hex code (type L to list codes): 82

          Changed system type of partition 1 to 82 (Linux swap / Solaris)

          

          Command (m for help): w

          The partition table has been altered!

          

          Calling ioctl() to re-read partition table.

          Syncing disks.

> mkswap /dev/sdf1


/etc/fstab을 편집하여 다음을 추가합니다.

[root@ip-10-124-189-22 ~]# cat /etc/fstab

/dev/sda1                 /                       ext3    defaults        1 1

tmpfs                   /dev/shm                tmpfs   defaults        0 0

devpts                  /dev/pts                devpts  gid=5,mode=620  0 0

sysfs                   /sys                    sysfs   defaults        0 0

proc                    /proc                   proc    defaults        0 0

/dev/sdf1               none                    swap    sw,nobootwait   0 0




12. 모든 것이 완료되었다. template ami를 생성하기 위해 아래의 명령을 실행하고 create ami로 해당 지역의 템플릿을 생성합니다.

chmod a+x /etc/rc.d/ec2.sh

 cat /dev/null > /var/log/boot.log

 cat /dev/null > /var/log/cron.log

 cat /dev/null > /var/log/dmesg.log

 cat /dev/null > /var/log/maillog.log

 cat /dev/null > /var/log/messages.log

 cat /dev/null > /var/log/oraclevm-template.log

 cat /dev/null > /var/log/secure

 cat /dev/null > /var/log/audit/audit.log

 cat /dev/null > /var/log/cups/error_log

 cat /dev/null > /root/.bash_history

 history -c



출처 http://www.javapattern.info/421



Posted by 나랑살자

댓글을 달아 주세요

JBoss에서 HTTPS를 사용하기 위해서는 몇가지 절차가 필요하다. 여기서는 클라이언트가 서버에 대한 인증을 필요로 하는 경우만 살펴본다. 상호 인증은 다음 기회에 살펴보겠다.

우선 인증서를 발급해야 한다. 발급하는 방법은 스스로 만들거나 베리사인과 같은 공인 인증기관에서 구입한다. 사설 인증서는 HTTPS로 접속할때 경고가 뜨지만 테스트에는 아무 문제가 없다. 윈도우 커맨드 창에서 다음 명령어를 실행하면 인증서를 만들게 된다. 
C:\>keytool -genkey -alias server -keyalg RSA -keystore server.keystore -validity 3650
암호, 조직 정보, 국가 코드 등 추가 정보를 입력하면 server.keystore라는 파일이 생성된다. 이 파일을 서버의 적당한 위치로 복사한다. 여기에서는 "${jboss.home.dir}/server/all/conf"으로 복사한다.

그리고 Tomcat의 Connector 설정을 다음과 같이 고친다.
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS" 
keystorePass="server" 
keystoreFile="${jboss.home.dir}/server/all/conf/server.keystore"  
URIEncoding="utf-8" />
keystorePass는 인증서를 만들때 입력했던 암호이고, keystoreFile은 인증서의 경로이다.

이제 https://localhost:8443/로 접속하면 된다.

[출처] JBoss - HTTPS(SSL) 지원 |작성자 파스스


Posted by 나랑살자

댓글을 달아 주세요

How To Enable “Click To Play” For Plug-ins And Flash In Google Chrome

Step – 1 : First, open a new Chrome window and enter “about:flags” into the URL bar and hit “Return”.

Step – 2 : Now, scroll down until you see “Click To Play” and enable the feature.

Step – 3 : Then, relaunch Chrome.

Enable "Click To Play" for Plug-ins and Flash in Google Chrome web browser (1)

Step – 4 : After that, enter Chrome Preferences either through the Chrome menu or by going to “chrome://settings” in the URL bar.

Step – 5 : Now, click on “Under The Hood” and after that click on “Content Settings”.

Step – 6 : Finally, alongside “Plug-ins”, you’ll see a newly enabled “Click To Play” option, choose that.

Posted by 나랑살자

댓글을 달아 주세요

To suppress the warning message:

  1. Open the virtual machine settings file (.vmx) for editing. Fusion users, for more information, see Editing the .vmx file for your Fusion virtual machine (1014782).
  2. Add this line to the file:
    buslogic.noDriver = "FALSE"
  3. Save the file.

Posted by 나랑살자

댓글을 달아 주세요

HTTP1.0-1.1 Protocol Massage & Header 구성요소
 


Massages

Header

   

생략여부

HTTP1.0

HTTP1.1

상용Header

General-Header

Date

현재시간

ex)Date: Tue, 15 Nov 1994 08:12:31 GMT

 

 

 

Pragma

캐시제어

ex)Pragma: no-cache

×

 

 

 

Cache-Control

케시 여부·업데이트시간·내용·지움등

×

 

 

 

Connection

연결끊기-http1.1 연결을 지속

ex)Connection: close

×

 

 

 

Transfer-Encoding

[entity-body] 압축방식

×

 

 

 

Upgrade

프로토콜 변경시

ex)Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11

×

 

 

 

Via

중계서버(프록시,게이트웨이등) 지원프로토이름·버전·호스트명

×

 

 

Entity-Header

Allow

사용이 허용되는 메소드열거

ex)Allow: GET ,HEAD ,OPTIONS ,TRACE

 

 

 

Content-Encoding

[entity-body] 리소스 압축방식(gzip, compress, deflate..)

ex)Content-Encoding: gzip

 

 

 

Content-Length

[entity-body] 리소스 크기(바이트 단위)

ex)Content-Length: 3495

 ×2

 

 

Content-Type

[entity-body] 미디어 타입

ex)Content-Type: text/html

 

 

 

expires

자원의 만기 날짜(케시데이터 업데이트요구)

ex)Expires: Thu, 01 Dec 1994 16:00:00 GMT

 

 

 

Last-Modified

가장 최근에 수정된 날짜

ex)Last-Modified: Thu, 01 Dec 1994 16:00:00 GMT

 

 

 

Content-Base

[entity-body]리소스 base-URL

ex)Content-Base: http://www.isoft.co.kr/

×

 

 

 

Content-Language

[entity-body]언어정보

ex)Content-Language: da

×

 

 

 

Content-Location

[entity-body] URL

×

 ×3

 

 

Content-MD5

전송시 [entity-body] 오류발생검사-[entity-body]일부를 요약1(MD5 RFC1864)

×

 

 

 

Content-Range

[entity-body]일부분 전송시의 해당부분(이어받기등에 사용)

ex)Content-Range: bytes 4150-5140/5140

×

 

 

 

ETag

케시 업데이트 정보를 위한 임의의 식별숫자4

ex)ETag: "0-556-343b9e36"

×

 


1 (MD5 RFC1864)-vase64 인코딩된 내용이 헤더값으로 존재한다.

2 requst-line method post 경우 생략 불가

3 Content-Base 없는 경우 생략이 불가.

4 Entity-Tag 라고 불리며, If-Match·If-None-Match·If-Range에서 사용

 


Massages

Header

   

생략여부

HTTP1.0

HTTP1.1

Request

Requst-Line

Method5

GET,POST,HEAD


OPTIONS,PUT,DELETE,TRACE

×

 

 

 

Request-URI

요청 데이터의 절대 주소나 상대주소.

ex)http://www.isoft.co.kt/index.html or /test/helloworld.html

 

 

 

HTTP-Version

HTTP" + 0.91.1(해당 프로토콜)

 

 

Request-Header

Authorization

사용자 인증정보 - 사용자 ID 암호가 함께 Base64 인코딩※6

ex)Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

 

 

 

From

자원의 생성자나 웹마스터의 전자우편 주소

ex)From: psycho@isoft.co.kr

 

 

 

If-Modified-Since

GET 사용시-헤더 필드에 지정된 날짜보다 나중 자원만 전달(케시일자검색)

ex)If-Modified-Since: Tue, 15 Nov 1994 12:45:26 GMT

 

 

 

Refer

한페이지에서 다른페이지를 요청할 (링크시) 이전 페이지 주소제공

ex)Referer: http://www.w3.org/hypertext/DataSources/Overview.html

 

 

 

User Agenter

browser 정보

ex)User-Agent: MyWebBroswer/0.5

 

 

 

Accept

클라이언트의 사용가능 미디어타입

ex)Accept: text/*, text/html, text/html;level=1, */*

×

 

 

(Content

 Neogotation)

Accept-Charset

클라이언트에서 사용할 있는 문자 집합(생략시 모두인식)

ex)Accepr: iso-8859-1, unicode-1-1

×

 

 

(Content

 Neogotation)

Accept-Encoding

클라이언트에서 제공되는 인코딩 방법(압축)

ex)Accept-Encoding: compress, gzip

×

 

 

 

Accept-Language

클라이언트가 인식할 있는 언어(우선순위가능)

ex)Accept-Language: da, en-gb;q=0.8, en;q=0.7(독일어, 영국영어, 영어)

×

 

 

 

Host

서버의 기본URL(하나의 IP주소에 여러개의 이름을 가진 멀티 서버를 지원)

ex)www.w3.org

×

×

 

 

If-Match

ETag 비교-Method수행-(PUT 메소드:해당header무시),다르면 402에러발생

ex)If-Match: "0-556-343b9e36"

×

 

 

 

If-None-Match

ETag 비교, 다를때-Method수행-(If-Match 반대),같을 에러

ex)If-None-Match: "0-556-343b9e36","0-1e4-34367116"

×

 

 

 

If-Range

클라이언트 캐시 정보를 업데이트 정보 (ETag or Date 비교)

×

 

 

 

If-Unmodified-Since

헤더값에 지정된 날자로부터 수정이 없는경우 Method 수행

ex) If-Unmodified-Since: Sat, 29 Oct 1994 19:43:31 GMT

×

 

 

 

Max-Forwards

메시지가 거쳐 갈수 있는 최대 Proxy 개수를 지정

ex)Max-Forwards: 7

×

 

 

 

Proxy-Authorization

비공개 프록시 서버 유저인증을 위한 코드

×

 

 

 

Range

자원의 일부분만 받을때(이어받기기능) 받을범위 지정

ex)bytes=0-499            : <- 0~499byte 얻고자 .

×



5 메소드에 대한 설명 : ·GET    - 요청한 URL 자료를 전송 (실행화일일 경우 실행 결과를 전송)

                           ·POST   - [Entity-body] 해당 서버에 수송(CGI활용, Entity-body 없거나, Content-Length 없으면 에러..(400에러))

                           ·Head   - 응답메시지는 [Entity-body]없이 전송됨

                              ·OPTIONS-자원과 관련된 필요 사항 결정 서버 기능검색

                           ·PUT    -메시지 바디 부분의 데이터를 지정한 요구 URI이름으로 저장한다.(ftp PUT 동일)

                           ·DELETE - 서버에서 요구 URI 지정된 자원을 지울 있다.

                           ·TRACE  - 요구 메시지가 최종 수신처에 도달 경로를 기록하는 루프백(loop back) 검사용

                                         (클라이언트 요구 메시지가 거쳐가는 프록시나 게이트웨이의 중간 경로부터 최종 수신 서버까지의 경로를 알아낼 사용,

                                       Max-Forwards 헤드 필드에는 중간에 거쳐갈 프록시나 게이트웨이 경로의 최대수를 지정)

6 ID :'Aladdin', PW : 'open sesame' 경우 'Aladin:open sesame' Base64 인코딩한 코드는 "QWxhZGRpbjpvcGVuIHNlc2FtZQ=="

    주의 : Base64 자체가 공개된 인코딩이므로 보안상 문제가 많다.

 


Massages

Header

   

생략여부

HTTP1.0

HTTP1.1

Response

Status-Line

HTTP-Version

HTTP" + 0.91.1(해당 프로토콜)

 

 

 

Status-Code

수신상태코드-(4Page 표참조.)

 

 

 

Respon-Phrase

수신 상태코드에 대한 간략한 설명-(4Page 표참조.)

 

 

Response-Header

Location

요구한 정보 실제 위치. 옮겨지거나 다를경우-정보주소가 실제 위치 정보.

(redirection,forwording , 절대주소만 가능.)

 

 

 

Server

서버 프로그램의 이름과 버전 정보

ex)Server: Apache/1.3a1

×

 

 

 

WWW-Authenticate   

사용자 인증이 필요한 자원을 요구시, 필요데이터와 서버가 제공하는 인증 방식

ex)WWW-Authenticate: Basic realm="아이 소프트"

×

 

 

 

Age

요구후 서버(origin Server)에서 응답생성하지까지의 시간(초단위)

×

 

 

 

Proxy-Authenticate

서버가 프록시 서버일 경우 유저 인증을 요구하기 위한 헤더이다.

×

 

 

 

Public

서버에서 지원 가능한 Method 리스트(제한의 의미는없음)

ex)Public: OPTIONS, MGET, MHEAD, GET, HEAD

×

 

 

 

Retry-After

503 에러시 -몇초(시간)후에 다시 요구 메시지를 보내라는 정보

ex)Retry-After: Fri, 31 Dec 1999 23:59:59 GMT(Time)

   Retry-After: 120   (Second)

×

 

 

 

Warning

상태코드와 응답 구문에 추가적인 경고

×

 

 

 

Vary

 

×

 


  

 

<Status-Code Header 수신상태 >


1xx: Informational -

 요구메시지를 받은

 연결 작업할 .

2xx: Success -

 요구메시지를 제대로 받았을 .

3xx: Redirection -

 요구메시지를 수행하기 위해

 다른 작업이 필요할 .

4xx: Client Error -

 요구 메시지의 형식이 틀리거나

 빠진 부분이 있을 .

5xx: Server Error -

서버에 문제가 있을 .

100 Continue

200 OK

 성공처리

300 Multiple Choices

 (실제 발생하지 않음)

400 Bad Request

 요구가 올바르지 않음

500 Internal Server Error

 예기치 못한 서버처리오류

101 Switching Protocols

201 Created

 요구에따라 새로운자원생성(PUT)

301 Moved Permanently

 URL 확정적으로 옮겨짐

401 Unauthorized

 사용자 인증이 필요

501 Not Implemented

 요구에 대한 지원불가

 (transfer-Encoding)

 

202 Accepted

 요구를 이해하였으며 진행중

302 Moved Temporarily

 URL 임시적으로 옮겨짐

402 Payment Require

502 Bad Gateway

 게이트웨이·프락시의 응답오류

 

203 Non-Authoritative Information

303 See Other

403 Forbidden

 요구는 이해하나 수행거절(PUT)

503 Service Unavailable

 서버부하로 응답불가

 

204 No Content

 요구자료에 정보가 없음(empty)

304 Not Modified(If-Modified-Since)

 수정날짜에 수정되지 않음

404 Not Found

 요구한 파일이 없음

504 Gateway Time-out

 

205 Reser Content

305 Use Proxy

405 Method Not Allowed

 허락된 메소드가 아님

505 HTTP Version not supported

 (요구를 무시할 있음..??)

 

206 Partial Content

 

406 Not Acceptable

 

 

 

 

407 Proxy Authentication Required

 

 

 

 

408 Request Time-out

 

 

 

 

409 Conflict

 

 

 

 

410 Gone

 

 

 

 

411 Length Required

 

 

 

 

412 Precondition Failed

 

 

 

 

413 Request Entity Too Large

 

 

 

 

414 Request-URI Too Large

 

 

 

 

415 Unsupported Media Type

 

Posted by 나랑살자

댓글을 달아 주세요

Flush dns to get a new name resolution. Also flush dns cache when you can’t access a newly registered domain name. You can simply flush your dns cache anytime to get new entry. So, Flush your dns cache now.

To flush DNS cache in Microsoft Windows (Win XP, Win ME, Win 2000):-

- Start -> Run -> type cmd
- in command prompt, type ipconfig /flushdns
- Done! You Window DNS cache has just been flush.

To flush the DNS cache in Linux, restart the nscd daemon:-

- To restart the nscd daemon, type /etc/rc.d/init.d/nscd restart in your terminal
- Once you run the command your linux DNS cache will flush.

To flush the DNS cache in Mac OS X Leopard:-

- type lookupd -flushcache in your terminal to flush the DNS resolver cache.
ex: bash-2.05a$ lookupd -flushcache
- Once you run the command your DNS cache (in Mac OS X) will flush.

To flush the DNS cache in Mac OS X:-

- type dscacheutil -flushcache in your terminal to flush the DNS resolver cache.
ex: bash-2.05a$ dscacheutil -flushcache
- Once you run the command your DNS cache (in Mac OS X Leopard) will flush. 


출처 : http://www.techiecorner.com/35/how-to-flush-dns-cache-in-linux-windows-mac/


Posted by 나랑살자
TAG cache, dns, 삭제

댓글을 달아 주세요

[LIB] gSoap

개발/기타 2011. 1. 27. 17:46
http://www.cs.fsu.edu/~engelen/soap.html
Posted by 나랑살자
TAG gSOAP, soap

댓글을 달아 주세요

12.5. iBATIS SQL Maps

The iBATIS support in the Spring Framework much resembles the JDBC / Hibernate support in that it supports the same template style programming and just as with JDBC or Hibernate, the iBATIS support works with Spring's exception hierarchy and let's you enjoy the all IoC features Spring has.

Transaction management can be handled through Spring's standard facilities. There are no special transaction strategies for iBATIS, as there is no special transactional resource involved other than a JDBCConnection. Hence, Spring's standard JDBC DataSourceTransactionManager orJtaTransactionManager are perfectly sufficient.

Note

Spring does actually support both iBatis 1.x and 2.x. However, only support for iBatis 2.x is actually shipped with the core Spring distribution. The iBatis 1.x support classes were moved to the Spring Modules project as of Spring 2.0, and you are directed there for documentation.

12.5.1. Setting up the SqlMapClient

If we want to map the previous Account class with iBATIS 2.x we need to create the following SQL map'Account.xml':

<sqlMap namespace="Account">

 

  <resultMap id="result" class="examples.Account">

    <result property="name" column="NAME" columnIndex="1"/>

    <result property="email" column="EMAIL" columnIndex="2"/>

  </resultMap>

 

  <select id="getAccountByEmail" resultMap="result">

    select ACCOUNT.NAME, ACCOUNT.EMAIL

    from ACCOUNT

    where ACCOUNT.EMAIL = #value#

  </select>

 

  <insert id="insertAccount">

    insert into ACCOUNT (NAME, EMAIL) values (#name#, #email#)

  </insert>

 

</sqlMap>

The configuration file for iBATIS 2 looks like this:

<sqlMapConfig>

 

  <sqlMap resource="example/Account.xml"/>

 

</sqlMapConfig>

Remember that iBATIS loads resources from the class path, so be sure to add the 'Account.xml' file to the class path.

We can use the SqlMapClientFactoryBean in the Spring container. Note that with iBATIS SQL Maps 2.x, the JDBC DataSource is usually specified on the SqlMapClientFactoryBean, which enables lazy loading.

<beans>

 

  <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">

    <property name="driverClassName" value="${jdbc.driverClassName}"/>

    <property name="url" value="${jdbc.url}"/>

    <property name="username" value="${jdbc.username}"/>

    <property name="password" value="${jdbc.password}"/>

  </bean>

 

  <bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">

    <property name="configLocation" value="WEB-INF/sqlmap-config.xml"/>

    <property name="dataSource" ref="dataSource"/>

  </bean>

 

</beans>

12.5.2. Using SqlMapClientTemplate and SqlMapClientDaoSupport

The SqlMapClientDaoSupport class offers a supporting class similar to the SqlMapDaoSupport. We extend it to implement our DAO:

public class SqlMapAccountDao extends SqlMapClientDaoSupport implements AccountDao {

 

    public Account getAccount(String email) throws DataAccessException {

        return (Account) getSqlMapClientTemplate().queryForObject("getAccountByEmail", email);

    }

 

    public void insertAccount(Account account) throws DataAccessException {

        getSqlMapClientTemplate().update("insertAccount", account);

    }

}

In the DAO, we use the pre-configured SqlMapClientTemplate to execute the queries, after setting up the SqlMapAccountDao in the application context and wiring it with our SqlMapClient instance:

<beans>

 

  <bean id="accountDao" class="example.SqlMapAccountDao">

    <property name="sqlMapClient" ref="sqlMapClient"/>

  </bean>

 

</beans>

Note that a SqlMapTemplate instance could also be created manually, passing in the SqlMapClient as constructor argument. The SqlMapClientDaoSupport base class simply pre-initializes aSqlMapClientTemplate instance for us.

The SqlMapClientTemplate also offers a generic execute method, taking a customSqlMapClientCallback implementation as argument. This can, for example, be used for batching:

public class SqlMapAccountDao extends SqlMapClientDaoSupport implements AccountDao {

 

    public void insertAccount(Account account) throws DataAccessException {

        getSqlMapClientTemplate().execute(new SqlMapClientCallback() {

            public Object doInSqlMapClient(SqlMapExecutor executor) throws SQLException {

                executor.startBatch();

                executor.update("insertAccount", account);

                executor.update("insertAddress", account.getAddress());

                executor.executeBatch();

            }

        });

    }

}

In general, any combination of operations offered by the native SqlMapExecutor API can be used in such a callback. Any SQLException thrown will automatically get converted to Spring's genericDataAccessException hierarchy.

12.5.3. Implementing DAOs based on plain iBATIS API

DAOs can also be written against plain iBATIS API, without any Spring dependencies, directly using an injected SqlMapClient. A corresponding DAO implementation looks like as follows:

public class SqlMapAccountDao implements AccountDao {

       

    private SqlMapClient sqlMapClient;

   

    public void setSqlMapClient(SqlMapClient sqlMapClient) {

        this.sqlMapClient = sqlMapClient;

    }

 

    public Account getAccount(String email) {

        try {

            return (Account) this.sqlMapClient.queryForObject("getAccountByEmail", email);

        }

        catch (SQLException ex) {

            throw new MyDaoException(ex);

        }

    }

 

    public void insertAccount(Account account) throws DataAccessException {

        try {

            this.sqlMapClient.update("insertAccount", account);

        }

        catch (SQLException ex) {

            throw new MyDaoException(ex);

        }

    }

}

In such a scenario, the SQLException thrown by the iBATIS API needs to be handled in a custom fashion: usually, wrapping it in your own application-specific DAO exception. Wiring in the application context would still look like before, due to the fact that the plain iBATIS-based DAO still follows the Dependency Injection pattern:

<beans>

 

  <bean id="accountDao" class="example.SqlMapAccountDao">

    <property name="sqlMapClient" ref="sqlMapClient"/>

  </bean>

 

</beans>

Posted by 나랑살자

댓글을 달아 주세요