웹 어플리케이션에서 클래스를, Class.forName() 으로 생성하는 것은 상당히 위험한 짓이다.
이는 또한 잘 생성되지도 않고, WAS 환경 하에서 되거나 안되거나 한다.

ContextClassLoader 를 사용하는 환경에서는, 자신이 클래스를 로드하기 위해 사용해야 하는 클래스로더를 제공하는 API 를 사용하여야 한다.

public static Class getClass(String name) throws Exception{
      ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
      Class classInstance = null;
      try {
          classInstance = classLoader.loadClass(name.trim());
      } catch (ClassNotFoundException e) {
          e.printStackTrace();
          throw e;
      }
      return classInstance;
  }
대략 위와 같이 메소드를 작성하여 사용할 수 있다.

절대 Application Server 환경에서, forName 하지 말도록~!
반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,
프로퍼티 파일을 사용해서 sqlMapConfig 에 DataSource 를 지정할 때, 공백 하나 때문에 수 시간을 낭비했다..ㅠㅠ

properties 파일애내에서
key=value 로 정의 할 때,

value 부분의 공백을 주의하자!
공백 없이 넣어야 한다!~ 이런!!!

그리고, Tomcat 에서 JNDI 리소스는 되도록 server.xml 에 Global 로 등록하고,
Context.xml 에는 ResourceLink 걸어준다.

마지막으로, web.xml 에서, resource-ref 는 없어도 된다.

META-INF/context.xml 을 넣는 것은, Gloabal 이 아니고, Context 에만 해당되도록 하는 것이나, WAR 배포하면, 패스워드도 함께 주는 것이라 보안 상 위험할 수 있다.
반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,

1. Commons Logging

 

Commons Loggin API는 자카르타 Commons에 포함되어 있는 프로젝트들이 로거로 사용하는 API이다. Commons Logging API는 자체적으로 로깅 기능을 구현하고 있지는 않으며, 로깅 요청을 Log4J나 자바1.4로깅 API와 같이 이미 존재하는 로깅 API에 전달하는 다리 역할을 한다. 즉, Commons Logging API를 사용하면 Log4J를 사용하든 자바 1.4의 로깅 API를 사용하든지에 상관없이 동일한 방식으로 로깅 코드를 작성할 수 있게 된다.

 

 

Loggin API를 사용하기 위해서는 다음의 두 클래스만 사용하면 된다.

- org.apache.commons.logging.Log

- org.apache.commons.logging.LogFactory

 

 

LogFactory는 사용자의 시스템에 알맞은 Log를 생성해주는 팩토리 클래스이다.

Log는 인터페이스라서 실제로 로그를 기록하는것은 Log 인터페이스의 구현체를 통해서 연결된 Log4J나 자바1.4의 로깅 API이다.

 

(사용예)

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

 

public class IbatisWithMysqlBoardDAO extends SqlMapClientDaoSupport implements BoardDAO {

...

 

     protected final Log logger = LogFactory.getLog(getClass());

 

     public List findBoardList(int currentPage, int countPerPage) throws SQLException {

     ...

          logger.debug("로그테스트");

     ...

     }

 

...

}

 

 

LogFactory는 다음과 같은 순서로 Log구현체를 선택하게 됩니다. (다음 생략...)

Log4J 라이브러리 파일을 CLASSPATH에 추가시켜주면 LogFactory는 탐색순서에 의해 Log구현체로 Log4J를 사용한다.(2순위)

 

 

Log구현체는 로그를 기록할 때 Commons Logging API의 로그 레벨을 실제로 사용하는 로깅 API의 로그 레벨로 알맞게 매핑시켜준다.

 Commons Logging 로그레벨 Log4J의 로그레벨  자바 1.4의 로그 레벨 
 TRACE DEBUG  FINEST 
 DEBUG DEBUG  FINE 
 INFO  INFO INFO
 WARN  WARN  WARNING
 ERROR  ERROR  SEVERE
 FATAL  FATAL  SEVERE

 

 

로그레벨의 판단을 위한 메소드

boolean isTraceEnabled()

boolean isDebugEnabled()

boolean isInfoEnabled()

boolean isWarnEnabled()

boolean isErrorEnabled()

boolean isFatalEnabled()

 

 

 

 

2. Log4J

 

Lo4J의 로그레벨(내림차순)

- Level.FATAL : 치명적인 에러

- Level.ERROR : 에러

- Level.WARN : 경고

- Level.INFO : 정보

- Level.DEBUG : 상세정보

 

 

Log4J의 구조

: Log4J는 크게 Logger, Appender, Layout의 3가지 요소로 구성되어 있다.

 

 

Appender

- org.apache.log4j.ConsoleAppender : 콘솔에 로그메시지 출력

- org.apache.log4j.FileAppender : 파일에 로그 메시지를 기록

- org.apache.log4j.RollingFileAppender : 파일에 로그 메시지를 기록하며, 파일이 일정 크기가 되면 다른 이름으로 저장하고, 새롭게 로그 메시지를 기록하기 시작한다.

- org.apache.log4j.DailyRollingFileAppender : 파일에 로그 메시지를 기록하며, 하루단위로 로그파일 변경

- org.apache.log4j.net.SMTPAppender : 로그메시지를 이메일로 전송한다.

- org.apache.log4j.nt.NTEventLogAppender : NT의 이벤트 로그 시스템에 로그 메시지를 전송한다. 윈도우즈 시스템만 사용 가능

 

 

Layout

: Layout은 org.apache.log4j.PatternLayout을 일반적으로 사용한다.

 

PatternLayout에서 지원하는 패턴

1) C : 로그메시지를 기록하려는 클래스의 이름 출력! 패키지 계층 제어 가능 ex) %C{2}

2) d : 메시지 기록 시간 출력! 포멧 지정 가능! 포멧은 java.text.SimpleDateFormat과 같은 포맷 ex) %d{yyyy-MM-dd HH:mm:ss}

3) p : 로그 메시지의 우선순위 출력

4) m : 로그 메시지 자체를 출력

5) M : 로그 메시지를 기록하려는 메소드의 이름 출력

6) n : 플렛폼의 라인 구분자를 출력

7) % : %%는 '%'자체를 출력

 

 

 

Log4J 설정파일 다루기

log4j.rootLogger = [level], appender_name, ...

 

log4.logger.logger_name = [level|INHERITED], appender_name,...

log4j.additivity.logger_name = true|false

 

log4j.appender.appender_name = [appender_calss_name]

log4j.appender.appender_name.option1 = value1

log4j.appender.appender_name.option2 = value2

 

log4j.appender.appender_name.layout = [layout_calss_name]

log4j.appender.appender_name.layout.option1 = value1

log4j.appender.appender_name.layout.option2 = value2

 

 

 

Log4J 설정파일 예

 

log4j.rootLogger=WARN, FILE
log4j.appender.FILE=org.apache.log4j.DailyRollingFileAppender
log4j.appender.FILE.File=d:/dev/log/error.log
log4j.appender.FILE.Threshold=ERROR
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=[%d] %-5p %l - %m%n

 

log4j.logger.com.kth.swaf.web.filter=INFO, FILTER
log4j.appender.FILTER=org.apache.log4j.ConsoleAppender
log4j.appender.FILTER.Threshold=INFO
log4j.appender.FILTER.layout=org.apache.log4j.PatternLayout
log4j.appender.FILTER.layout.ConversionPattern=%-5p - %m%n

 

log4j.logger.com.kth.swaf=WARN, SWAF
log4j.appender.SWAF=org.apache.log4j.ConsoleAppender
log4j.appender.SWAF.Threshold=WARN
log4j.appender.SWAF.layout=org.apache.log4j.PatternLayout
log4j.appender.SWAF.layout.ConversionPattern=[%d] %-5p - %m%n

 

반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,

web.xml 에 설정하는 방법도 있다. 이게 확실하고 깔끔한 방법이다.
하지만, WEB-INF 밑에 JSP 를 두는 방법으로도 가능하다.

단, 이때는, href 나 Form Submit 할 때, 직접 WEB-INF/abc.jsp 처럼 접근할 수 없으므로 주의해야 한다.
WEB-INF 밑의 JSP 파일 접근 하려면, Struts 의 Action 에 Mapping 하거나 하여 Framework 이 Page를 Return 하도록 하는 방법을 사용해야 한다.

이왕이면 .jsp 요청은 받아들이지 않게 하는게 좋을것이다.
반응형

'Software Development > JavaSE&EE' 카테고리의 다른 글

iBatis 에서 JNDI 설정 시 주의사항  (0) 2009.10.25
Commons Logging 과 Log4J  (0) 2009.10.16
변수명 표기법 종류  (0) 2009.10.12
OAuth - Open Source 보안인증 API  (0) 2009.09.23
RuntimeException 의 특성  (0) 2009.08.12
블로그 이미지

Good Joon

IT Professionalist Since 1999

,
htpasswd 기반의 사용자 생성은, AccountManager 플러그인을 사용해서 쉽게 할 수 있다 치고, 권한을 사용자에게 할당해야하는 부분이 남아있다.

Trac 의 권한 설정은 처음에는 좀 낮설었지만, 조금 하다 보니 어느정도 이해가 간다. (그렇지만 아직 사용자를 그룹핑하는 방법을 몰라서 조금 아쉬운데..)

우선, admin 권한의 사용자로, Admin>Permissions 메뉴로 들어가면 아래와 같은 화면이 나온다.


그러면 위에서와 같이, 우측에 Grant Permission: 과 Add Subject to Group 이라고 나온다.

우선, Grant Permission에서,
Subject 에는, 권한그룹명을 써준다. 여기서는, "리더" 라는 권한그룹명(그룹명)을 써준다.
그리고, Action 에서, 해당 권한을 골라서 하나씩 추가해줄 수 있다.

Add Subject to Group: 에서는, 사용자에게, 권한그룹을 할당할 수 있다.
혹은, 권한그룹에 다른 권한그룹을 할당할 수 있다. (즉, 여러 권한들을 모아서 하나의 권한집합 생성도 가능)
여기서는, korean44 라는 사용자에게, "리더" 라는 권한그룹을 할당 한 것이다.

복수개의 권한이 적용 가능하며(아직 안해봤지만 그리 되겠지), 권한그룹이 다른 권한그룹을 포함할 수 있다.
단, 권한그룹에 사용자를 추가하는 방법은 불가하다. 사용자가 권한그룹을 갖는것은 가능하지만 말이다.
반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,
apache 는 2.2 를 사용한다라는 가정 하에, php 5.2.11 을 설치해본다.

apache 는, /usr/sbin 에 bin 이 설치되었다라고 가정한다.

1. 다운로드 및 tar.gz 압축 풀기
 이 과정은 뭐 별도 설명 없어도 가능하다라는 가정 하에 진행한다.
 wget 으로 받아놓고, 압축 풀면 되겠다.

2. configure 설정

./configure --prefix=/usr --with-apxs2=/usr/sbin/apxs --with-config-file-path=/etc --with-mysql=/usr --with-exec-dir=/usr/sbin --with-zlib --with-gd --with-ttf --with-png --with-jpeg-dir --with-iconv


--with-apxs2 : apache 에 DSO 모듈로 등록하겠다는 이야기이고, apache 설치할 때 깔린 apxs 파일의 경로 써주면 됨.
--with-config-file-path : php.ini 파일의 경로
--with-mysql : mysql 설치된 home
--with-exec-dir : apache 의 bin 디렉토리
나머지는 알아서..

3. make

4. make install

하고 나면, 대충 install 은 된다.

[설정]

1. httpd.conf 에 설정하기

LoadModule php5_module modules/libphp5.so

#
# Cause the PHP interpreter to handle files with a .php extension.
#
AddHandler php5-script .php
AddType text/html .php

#
# Add index.php to the list of files that will be served as directory
# indexes.
#
DirectoryIndex index.php

위와 같은 내용을 httpd.conf 에 혹은 별도 외부 .conf 에 정의 후에 include 하여야 한다.

하다보니,
내 Ubuntu 의 Apache 2.2.11 의 경우,. conf/httpd.conf 와 conf/extra 디렉토리 내에, 각 파트별 .conf 파일이 나뉘어 있고,
회사에서 설정하던 Linux 서버에는 conf/httpd.conf 가 있고, conf.d/각종.conf 파일이 있더라는.. 이건 잘 알아서 판단하여 넣어준다.

위의 conf/extra 구조로 되어있는 경우에는, httpd.conf 파일에, 위 내용을 기술해 주는것이 나을테고, conf.d 구조로 되어있는 경우, 위의 내용을 php.conf 등으로 저장하여 추가해놓으면 설정이 되겠지요.

2. php 작동 확인

test.php 페이지를 하나 만들고, 내용은,
<?php
 phpinfo();
?>


처럼 하면 된다.

확인할 때, mysql 연동 잘 되었는지 보고, Zend 설정 되었는지 등도 확인해라. (Zend 설정은, 안된 경우, 별도의 Zend Optimizer 설치하도록 한다)
반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,
root 패스워드를 분실한 경우(응급조치)

mysql을 오랫동안 사용하지 않았을 경우에 간혹 root패스워드가 기억나질않아서 당황할 때가 있습니다.  시스템관리자라면 시스템의 root나 MySQL의 root의 암호를 잊어 버렸을 때를 대비해서 패스워드를 새로 설정하는 방법을 반드시 숙지하고 있어야 할 것입니다.

① 실행중인 msyql 종료

# ps -ef | grep mysqld
root      9567     1  0 Mar16 ?        00:00:00 sh ./mysqld_safe
root      9576  9567  0 Mar16 ?        00:00:00 /usr/local/mysql/libexec/mysqld
root      9578  9576  0 Mar16 ?        00:00:00 /usr/local/mysql/libexec/mysqld
root      9579  9578  0 Mar16 ?        00:00:00 /usr/local/mysql/libexec/mysqld

# killall mysqld

② grant-table 미사용모드로 mysql시작(권한 테이블을 사용하지 않는 옵션으로 데몬 실행)

# ./safe_mysqld  --skip-grant-tables &
[1] 12084
# Starting mysqld daemon with databases from /usr/local/mysql/data
#

# ./mysql -u  root  mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1 to server version: 3.22.24
Type 'help' for help.
mysql>

※ mysqld_safe 명령어는 mysql 데몬을 실행시킨다.

③ update문으로 root사용자 패스워드 갱신

mysql> update user set password=password('123') where user = 'root';
Query OK, 3 rows affected (0.00 sec)
Rows matched: 3  Changed: 3  Warnings: 0
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)
mysql> \q         
Bye

④ 실행중인 mysql 다시 종료(권한 테이블을 사용하지 않는 데몬을 종료)

# ps -ef | grep mysqld
root     12084 11558  0 20:10 pts/2    00:00:00 sh ./mysqld_safe --skip-grant-ta
root     12090 12084  0 20:10 pts/2    00:00:00 /usr/local/mysql/libexec/mysqld
root     12092 12090  0 20:10 pts/2    00:00:00 /usr/local/mysql/libexec/mysqld
root     12093 12092  0 20:10 pts/2    00:00:00 /usr/local/mysql/libexec/mysqld
#
# killall mysqld
mysqld daemon ended
[1]+  Done                    ./mysqld_safe --skip-grant-tables
#

⑤  Mysql 데몬 재 실행 후 갱신된 패스워드로 로그인

# ./safe_mysqld &
[1] 12102
# Starting mysqld daemon with databases from /usr/local/mysql/data
#

# ps -ef | grep mysql
root     12102 11558  0 20:13 pts/2    00:00:00 sh ./mysqld_safe
root     12108 12102  0 20:13 pts/2    00:00:00 /usr/local/mysql/libexec/mysqld
root     12110 12108  0 20:13 pts/2    00:00:00 /usr/local/mysql/libexec/mysqld
root     12111 12110  0 20:13 pts/2    00:00:00 /usr/local/mysql/libexec/mysqld

# mysql -u  root  -p
Enter Password: ***************



완.료.

반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,

mysql 의 root 는 기본적으로 패스워드가 비어있다. 이대로 계속 두었다가는 낭패..
phpadmin 이라도 설치하면 편하겠는데, 언제 그걸 설치하는가..
mysql.user 테이블의 password 를 변경해서 쉽게 적용하자.

mysql -uroot
mysql> use mysql;
mysql> update  user  set  password=password('123456') where user='root';
mysql> flush privileges;

요렇게 간단하게 끝내자. 마지막 flush privileges; 안하면, DB 를 내렸다 올려야 한다. 꼭 권한변경 해주면 함께 해주도록 한다.

update 를 사용해서, 접속 가능한 host 등도 쉽게 변경하도록 한다.

mysql> UPDATE user SET grant_priv='N', show_db_priv='N', super_priv='N', create_user_priv='N' where user='cserver';
mysql> flush privileges;
반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,

Trac 의 기본 textarea 기반의 에디터는 정말.. 말이 안나온다.

어느정도 기본적인 기능을 갖춘 WYSIWYG 에디터 플러그인을 설치해서 사용하도록 한다.

[다운로드]


그런데 왜 그 흔한 색상지원이 안되는건지 모르겠다. 다른 플러그인이 또 있으려나..

반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,

Ticket 삭제는 내부에 기능이 없고, 별도의 플러그인을 설치해야 한다.

TicketDeletePlugin 을 다운로드 해서 설치해준다.

그러면 Admin 메뉴에 Ticket Sysems> delete, delete Change 와 같은 메뉴가 생긴다.


삭제 시에는, Ticket 의 ID (티켓 번호 #100 --> 100) 가 필요하다.
선택이 아니라, 직접 입력해야 한다.


왜 직접 ID를 적게 하고, Again 에서, 같은 ID 를 또한번 넣게 하는지 모르겠다.. 두번 입력하는것 좋은데, 선택할 수 없는게 약간 답답하기는 하다.


반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,