Object To Json

 

/**
 * Object to JsonString
 * 
 * @param Object obj
 * @return String
 * @throws Exception
 */

public static String getObjectToJson(Object obj) throws Exception {

    // Object isEmpty 판별
     if( isEmpty(obj) ){
         return "";
     } else {
         ObjectMapper mapper = new ObjectMapper();
         return mapper.writeValueAsString(obj);
     }
}

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.util.Base64;

public class AES256 {
    /**
     * 암호화 기법 중 AES256 방법을 소개
     * 대표적인 양방향 암호화
     * 대칭키: 암호화, 복호화에 동일한 키가 사용 됨
     * 비대칭키: 암호화, 복호화의 다른 키가 다름
     */

    // 16바이트(128비트) IV(Initialization Vector). CBC 모드에서 첫 블록을 암호화할 때 사용.
    private static final String IV = "1234567890abcdef";
    // 32바이트(256비트) 비밀 키. AES256 암호화/복호화에 사용됩니다.
    private static final String secretKey = "12345678ABCDEFGHabcdefgh12345678";


    /**
     * Cipher 객체를 생성하고 초기화하는 메서드
     *
     * @param cipherMode 암호화(Cipher.ENCRYPT_MODE) 또는 복호화(Cipher.DECRYPT_MODE) 모드 지정
     * @return 초기화된 Cipher 객체
     * @throws Exception Cipher 생성 또는 초기화 중 발생할 수 있는 모든 예외 처리
     */
    public static Cipher createdAES256(int cipherMode) throws Exception {
        // AES 알고리즘, CBC 모드, PKCS5 패딩을 지정하여 Cipher 인스턴스 생성
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

        // 비밀 키(secretKey)를 UTF-8 바이트 배열로 변환
        byte[] keyBytes = secretKey.getBytes(StandardCharsets.UTF_8);
        // IV(초기화 벡터)를 UTF-8 바이트 배열로 변환하여 IvParameterSpec 객체 생성
        IvParameterSpec ivParameterSpec = new IvParameterSpec(IV.getBytes(StandardCharsets.UTF_8));

        // 키 바이트 배열과 "AES" 알고리즘 이름을 사용하여 SecretKeySpec 객체 생성
        SecretKeySpec secretKeySpec = new SecretKeySpec(keyBytes, "AES");
        // 생성한 Cipher 객체를 지정된 모드(암호화/복호화), 비밀 키, IV로 초기화
        cipher.init(cipherMode, secretKeySpec, ivParameterSpec);

        return cipher;
    }

    /**
     * 평문(plainText)을 AES256으로 암호화하고 Base64로 인코딩합니다.
     *
     * @param plainText 암호화할 평문 문자열
     * @return Base64로 인코딩된 암호문 문자열
     * @throws Exception 암호화 중 발생할 수 있는 모든 예외 처리
     */
    public static String encrypt(String plainText) throws Exception {
        // 암호화 모드로 초기화된 Cipher 객체 가져오기
        Cipher cipher = createdAES256(Cipher.ENCRYPT_MODE);
        // 평문 문자열을 UTF-8 바이트 배열로 변환하여 암호화 실행
        byte[] encryptedBytes = cipher.doFinal(plainText.getBytes(StandardCharsets.UTF_8));
        // 암호화된 이진 데이터를 Base64 인코딩하여 안전한 문자열로 변환 후 반환
        return Base64.getEncoder().encodeToString(encryptedBytes);
    }

    /**
     * Base64로 인코딩된 암호문(encryptedText)을 복호화하여 평문으로 되돌립니다.
     *
     * @param encryptedText 복호화할 Base64 인코딩된 암호문
     * @return 복호화된 평문 문자열
     * @throws Exception 복호화 중 발생할 수 있는 모든 예외 처리 (Base64 디코딩 실패 포함)
     */
    public static String decrypt(String encryptedText) throws Exception {
        // 복호화 모드로 초기화된 Cipher 객체 가져오기
        Cipher cipher = createdAES256(Cipher.DECRYPT_MODE);
        // Base64로 인코딩된 문자열을 이진 바이트 배열로 디코딩
        byte[] encryptedBytes = Base64.getDecoder().decode(encryptedText);
        // 디코딩된 바이트 배열을 복호화 실행
        byte[] decryptedBytes  = cipher.doFinal(encryptedBytes);
        // 복호화된 바이트 배열을 UTF-8 문자열로 변환하여 반환
        return new String(decryptedBytes, StandardCharsets.UTF_8);
    }

    /**
     * 메인 메서드: 암호화 및 복호화 과정을 테스트합니다.
     * @param args 프로그램 인자 (사용되지 않음)
     * @throws Exception 테스트 과정 중 발생할 수 있는 모든 예외 처리
     */
    public static void main(String[] args) throws Exception {
        String plainText = "Hello~~";
        System.out.println("plainText :: " + plainText);
        String encrypted = encrypt(plainText);
        System.out.println("encrtyped :: " + encrypted);
        String decrypted = decrypt(encrypted);
        System.out.println("decrypted :: " + decrypted);
    }
}

우선 프로젝트의 중간 참여자로서 ( 메뉴 가지치기 추가 ) 기존 사용하던 HttpSession 객체가 있었다.


내가 이용하고자 하는 정보는... 로그인 유저의 정보를 이용해, 다른정보를 가져오는 것이었다.


근데 중간 참여자로서 물어볼 사람도 없고, 물어봐도 원하는 대답들이 아니었다.


Session으로 넘어온 정보들을 나열해서 볼 수 있다면.... 원하는 정보를 찾아 이용할 수 있겠는데


찾아보던중 Enumeration을 이용하여 가져오는것이었다.


// Enumeration에 session의 속성정보를 담아 Key를 추출한 다음 해당 Value를 찾아오는 것이었다.

Enumeration<String> enum_session = session.getAttributeNames();

while(enum_session.hasMoreElements()) {

String key = enum_session.nextElement();

Logger.info("key --> " + key);

}


처음에는 

String Key = enum_session.nextElement(); 로 하여

String Value = session.getAttribute(key); 로 하였으나 Cast 오류가 나는것이었다.


HttpSession 에 Key는 스트링으로 가지고 있지만


Value는 다양한 형태의 Object가 있어 오류가 나는것이었다.


결국엔 Key를 나열하여 해당하는 Value의 형태로 Cast를 후 처리하였다.


역시 가장 기본적인 예외사항을 체크하지 않은것을 반성해야겠다.


개발엔 정해져 있는게 아닌것을....

Chrome 에서는 그리드의 Editable Cell 클릭시 X버튼표시가 없었는데


유독IE에서만 X버튼이 발생되었다.

CSS 문제인듯 아무리 건드려봐도 지워지지 않았고 변경되지 않았다.


AUI에 문의해보니 당사에서 CSS를 변경해 쓰고있지 않느냐고해서... 그렇지 않다고 했다.

재문의 해보니 IE브라우저의 특징이라고 IE10이상에서는 meta태그의 content를 IE=edge로 변경하라고 했다.

그렇게 진행했더니 아무일 없듯이 X버튼이 표시되지 않았다.

기존에 사용하고있던 meta content가 IE=9 이었던 데다가, 필자가 환경설정을 하지 않아 함부로 건드릴 수가 없었다.

그러나, 찾아보니... 


http-equiv="X-UA-Compatible"는 IE에서만 작동하는 비표준 속성이며,


IE=5 : 관용모드(quirks mode)로 지정된 DOCTYPE에 상관없이 IE5 렌더링 방식이 사용됩니다.

IE=7 : IE7 표준모드로 지정된 DOCTYPE에 상관없이 IE7 표준 모드 렌더링 방식이 사용됩니다.

IE=EmulateIE7 : IE7 에뮬레이션 모드로 지정된 DOCTYPE에 따라 IE7 표준모드나 관용모드로 렌더링됩니다.

IE=8 : IE8 표준모드로 지정된 DOCTYPE에 상관없이 IE8 표준모드로 렌더링됩니다 .

IE=EmulateIE8 : IE8 에뮬레이션 모드로 지정된 DOCTYPE에 따라 IE8 표준모드나 관용모드로 렌더링됩니다.

IE=edge : 최신모드로 지정된 DOCTYPE에 상관없이 IE8 이상 버전에서 항상 최신 표준 모드로 렌더링됩니다.

출처: https://webdir.tistory.com/38 [WEBDIR]

라는 자료를 찾아볼 수 있었고, edge로 설정함으로서 프로그램 가동에 아무 문제 없음을 확인하였다.

( 혹 모르는 다른 문제가 생길까 두렵기도 하였다. 아직 부족한 지식이라.... )


meta태그 필요없이 서버 자체에 HTTP Header설정을 할 수 있다는걸 봤는데.. 다음에 기회되면 이걸 찾아봐야겠다.

+ Recent posts