목차

반응형

이클립스에서 빌드 후, 프로젝트를 서버에 배포 할 때 자주 발생하는 오류로 평소 주변 사람한테는 메이저 마이너 오류라고 일컫어서 말한다.


이미 인터넷 상에 많이 나와있는 오류로 원인은 현재 서버에서 사용하고 있는 JDK 버전과 빌드하여 배포하고자 하는 프로젝트의 Class 파일의 컴파일 JDK 버전이 호환이 안되기 때문에 발생하는 문제라고 한다.

그중에서도 51.0은 JDK 1.7을 지칭한다고 한다.


근데 필자의 경우 매우 헤맸던것이 분명 자바 버전은 1.7을 가리키고 있는데 위의 에러가 발생 한 것 이다.


해결하는 방법은 크게 두 가지다.

1. 서버의 JDK 버전을 업그레이드 -> 현재 서버에 다른 프로젝트가 많이 들어가 있어서 불가능


2. 프로젝트의 빌드 컴파일 JDK를 다운그레이드 -> 가능하지만 상황에 따라(maven 라이브러리들의 버전 호환x) 불가능한 경우도 있음.


결국 2번 방식을 택하기로 하였다.


현재 프로젝트의 jdk 버전은 java -version 명령어를 통하여 확인한다.(사실 이렇게 확인하면 틀릴수도 있다.)


버전을 확인해보니 1.7이었다. 아니 분명 빌드를 1.7기준으로 했는데 이클립스 로컬에서는 잘 작동하였지만 서버에 배포를 하고 가동을 해보니 오류가 나서 매우 당황했다.


일단은 JDK를 1.6으로 낮춰서 컴파일 한 뒤에, 프로젝트를 배포해보았다.

그랬더니 이번에는 또 java.lang.NoSuchMethodError 에러가 난다.

하 빡쳐 ... 분명 JDK 문제같은데 log 관련된 클래스가 제대로 작동을 안해서 그런 것 같아보인다.


그러던 도중 로그상에 찍힌 jar파일의 경로를 확인해보니까 라이브러리 밑에 있단는 것을 깨닫고 pom.xml의 maven 설정을 확인해보았더니 아니나 다를까 문제가 발생한 jar파일이 그곳에 적혀있었다.


그리고 해당 라이브러를 추적해보니 결국 해당 라이브러리를 포함하고 있는 최상위 라이브러리의 이름은 spring-context 4.0.9였다.

여기서 jdk를 낮추면 spring-context 버전도 낮추어야한다는 것을 깨달았다.

그래서 jdk를 낮춰서 빌드한 뒤에 spring context 버전도 낮춰서 빌드를 해보았으나 프로젝트에서 필수적으로 같이 구동해야하는 라이브러리들의 버전들도 맞지가 않아서 오류가 많이 발생하였다.

상사한테 물어보니 걔네들도 jdk 버전에 맞춰서 버전을 낮춰주면 된다고는 했는데 복잡해질수도 있으니까 그냥 jdk 버전을 맞춰서 프로젝트 배포하는 것이 편하다고 하였다.

그래서 jdk 버전을 낮춰서 작업하는 것은 포기하기로 하였다.


그리고 여기서 알게된 충격적인 사실


사실 내가 배포하려고 했던 서버의 jdk 버전이 1.7이 아니었던 것 이다.

jdk가 1.6 1.7 둘다 깔려있었고 기본적으로 linux 서비스에 등록된 java는 1.7이지만 톰캣에서 구동할때 사용하는 jdk는 1.6을 가리키고 있던 것 이었다.

그러니까 안되지 ㅡㅡ


톰캣을 구동하기 위한 스크립트 catalina.sh를 열어보면


위와 같이 JAVA_HOME으로 JDK의 경로에 대한 환경변수를 설정하는 부분이 있다.


echo $JAVA_HOME을 통하여 현재 톰캣에서 사용중인 java 경로를 확인한다.


bin에 java가 있어서 해당 자바 파일로 버전을 확인해보았다.


jdk 버전이 1.6이다.


결국 톰캣으로 JDK 1.7을 사용하는 서버에 새로 옮겨서 배포해보았더니 귀신같이 잘 된다.


반응형
반응형

spring에서 requestmapping에 get parameter로 받도록 되어있으면 페이지 주소가 아래처럼 뒤에 parameter에 대한 정보가 남기 마련이다.


보안상의 문제로 뒤에 붙는 주소들을 안보이도록 처리를 해달라고 요청이 왔다.

곰곰이 생각을 해보았는데 그냥 안보이도록 하는 것은 문제가 있었다.

그래서 기존에 parameter를 받아서 처리하는 requestmapping으로 넘겨주도록 redirect 해주는 requestmapping을 새로 추가하여 뒤의 인자값이 따라 붙지 않도록 수정해보았다.



bbslist.do가 기존에 parameter를 그대로 노출시키도록 되어있는 requestmapping이다.




하지만 페이지가 호출되고나서 주소창에서 보이는 뒤의 인자값을 안보이게 하고 싶은 것 이다.


requestmapping에 도달하기전 단계를 추가하기 위하여 sbbslist.do를 새로 생성해준다.


보통의 requestmapping과 다르게 RedirectAttributes를 사용한다.

해당 attributes에 원하는 데이터를 넘겨준 뒤, 마치 forward를 사용하듯이 redirect를 통하여 페이지를 넘겨준다.


페이지는 위와 같은데 이렇게 하면 get parameter로 따라붙는 인자값들은 보이지 않고 페이지의 호출이 완료 되었을 때 sbbslist.do라는 주소값을 가지고 페이지가 호출된다.



반응형
반응형

java 웹앱에서 로그인시 패킷에 입력한 아이디와 비밀번호가 암호화가 안되어서 날라간다고 암호화를 해달라고 요청이 왔다.

사실은 정교한 암호화를 해야하지만 급한일이 매우 많기에 일단 javascript와 java에서 쉽게 사용이 가능한 base64 암호화를 사용하였다.

form의 형태는 위와 같다.



현재 데이터를 입력한 뒤, 전송하면 위 처럼 암호화가 안되어서 날아간다.


javascript에서는 폼을 전송하기전에 btoa 함수를 사용하여 base64 암호화 처리를 해준다.

위 처럼 스크립트를 작성하면 전송도중 ID 부분에서 base64 암호화 결과값이 노출된 상태로 전송된다.

오늘 또 그 부분에 대해서 수정해달라고 요청이 왔기에

form에 hidden으로 아이디 넣는 부분을 만들어서 base64 암호화된 데이터는 따로 전송을 해줘야 할 것 같다.


일단 데이터는 암호화가 잘 되어서 날아간다.


위 처럼 base64 복호화 함수를 생성한다.

    public static String decrypt(String data) throws Exception {

if (data == null) {
return "";
}

byte[] hashValue = null; // 해쉬값
hashValue = data.getBytes();

return new String(Base64.decodeBase64(hashValue));
}



마지막으로 해당 객체를 이용하여 form에서 날아온 데이터를 복호화해서 사용한다.


반응형
반응형

톰캣을 돌리다 보면 java.lang.OutOfMemoryError: PermGen space 오류를 만날때가 있다.

로컬에서는 손쉽게 해결이 가능하지만 아무래도 cui 환경에서는 당황하기 쉽다.


회사의 동료가 갑자기 메모리 오류가 나서 지원을 하게 되었다.

일단 tomcat을 구동할때 불러오는 스크립트를 찾아야한다.

catalina.sh라고 알려져있는데 작업하던 서버에는 없었다.



vi /etc/rc.d/init.d/tomcat -> 톰캣버전에따라 다르다 나같은경우는 tomcat6

vi로 까보면 각종 설정이 있다. 근데 tomcat 환경설정을 하는 스크립트는 없다.

이곳에서 또 tomcat 환경설정을 해주는 스크립트를 불러온다.

/를 누르고 검색모드에서 TOMCAT_SCRIPT를 찾는다.


vi로 까본다.


그러면 그곳에 또 톰캣 conf파일이 있다.

얘를 까본다.



그러면 이제 좀 뭔가 톰캣설정하는 구문들이 보이는데(JAVA_OPTS 이런거)

여기다가 적당히 메모리를 증진시켜주는 명령어를 넣어준다.

JAVA_OPTS=" -Xms512m -Xmx1024m -XX:MaxPermSize=256m"



그러면 이제 톰캣 재시작하고 제대로 반영이 제대로 되었는지 확인해본다.



ps -ef |grep tomcat6 -> (톰캣버전은 알아서 맞춰서 적어야함)

확인해보면 적었던 명령어로 제대로 돌아가고 있는 것이 확인이 된다.


이후 오류메시지가 안떴음.





반응형
반응형

웹사이트(jsp)에 휴대폰 인증을 붙였는데 인증하고나서 아래 오류가 뜨면서 다음 페이지로 안넘어 갈 때가 있다.


blocked a frame with origin null from accessing a cross-origin frame


대강 이 오류는 근원이 다른 홈페이지(내 홈페이지, 인증 모듈 홈페이지)javascript를 통하여 근원이 다른곳에서 window를 조작하려고 할 때 발생하는 오류다.


보통 휴대폰 인증 모듈의 샘플에는 부모 윈도우를 조작하기 위해 opener.window.name 이런식으로 조작하는데

윈도우의 이름을 지정해줘서 그 값으로 조작해주면 잘 된다.



본인인증을 호출하는 홈페이지에서 호출하기전에 window.name을 통하여 윈도우 이름을 바꿔준다.


이후 타겟을 opner.window.name에서 "window"로 바꿔준다.

반응형
반응형

사실 질문부터가 잘못됐다.

DB에 삽입한 줄바꿈 문자가 띄어쓰기로만 처리가 되는 것이 아니라 DB에는 잘 들어가지만 css의 문제로 인하여 두칸 이상의 띄어쓰기가 한칸의 띄어쓰기로 바뀌어버리는 것이다.


ㄹㅇ 디비쪽에 잘못들어간다고 확신을 해버려서


텍스트를 이스케이프해서

StringEscapeUtils.escapeJava

https://stackoverflow.com/questions/2406121/how-do-i-escape-a-string-in-java


jsp에서 jstl로 이스케이프된 \r\n을 <br>태그로 바꿔주려고 했다.

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<% pageContext.setAttribute("newLineChar", "\n"); %>

${fn:replace(item.comments, newLineChar, "; ")}

https://stackoverflow.com/questions/58054/how-can-i-replace-newline-characters-using-jsp-and-jstl

근데 위에방식으로하면 한글문자도 escape처리가 되버려서 한글문자가 안나옴


위의 내용을 하느라 한시간 이상을 날려버렸는데 다른분이 10초만에 해결해주고 가셨다.

표출해주는 태그쪽에다가 아래의 스타일을 걸어주면 잘된다.

style="white-space: pre-line;"



스타일을 걸어주면 된다.

개뻘짓.

반응형
반응형

스프링에서 다운로드 요청을 하면 크롬이나 기타 브라우저는 잘 작동하지만 파이어폭스, 사파리에서는 다운로드가 안되는 경우가 있다.


그럴때는 파일 다운로드에 대한 결과 response에 헤더값을 파일로 지정을 해주면 된다.

response.setHeader("Pragma", "public");

response.setHeader("Expires", "0");

response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");

response.setHeader("Content-type", "application-download");

response.setHeader("Content-Disposition", "attachment; filename=" + fvo.getStreFileNm());

response.setHeader("Content-Transfer-Encoding", "binary");

https://stackoverflow.com/questions/8876924/how-to-download-xml-file-from-server-in-ie-using-java/8877983#8877983

반응형
반응형

아파치단

http://nahosung.tistory.com/107


톰캣단

https://sarc.io/index.php/tomcat/240-tomcat-response-header-server


나같은경우는 아파치단에서 해결해야했음

반응형
반응형

bizsiren 휴대폰 인증, IPIN 인증 모듈 사용시

PccIpinSecu 또는 PccHpSecu 함수에서 java.lang.StringIndexOutOfBoundsException 에러가 발생한다.



근데 아직도 모르겠는게 일단은 원인 해결해서 넘어갔는데 분명 저런문제가 없었는데 갑자기 어느날부터 저런 에러가 발생했다.



에러 메시지는 아래와 같다.

java.lang.StringIndexOutOfBoundsException: String index out of range: -1

at java.lang.String.substring(String.java:1911) ~[?:1.7.0_151]

at CommonUtil.PccIpinSecu(Util.java:547) ~[classes/:?]


까보니까


retInfo  = sciSecuMg.getDec(retInfo, ReqNum);


int inf1 = retInfo.indexOf("/",0); <===== 요기에서 에러가 난다.

retInfo는 뭐하는놈이냐면 인증 모듈에서 서버측으로 전송하는 암호화된 인증 결과값이다.

getDec는 인증사에서 암호화되어 넘어온 retInfo를 유저 브라우저의 세션에서 저장되어 키값역할을 하는 ReqNum로 복호화를 해야하는데 (SciSecuManager 자바파일이 없어서 자세한건 모름)



서버쪽하고 클라이언트쪽에 얼러트와 sysout을 마구 심어서 살펴본 결과 문제를 찾았다.

세션에서 잘 유지되고 있어야하는 ReqNum이 null이어서 복호화하고나서(애초에 복호화하면 결과값이 ""임 복호화부터 실패한거지만 에러가 안날뿐임) 복호화된 정보를 split할때 인덱스 에러가 나는것이다.



근데 이게또 웃긴게 어떤컴퓨터는 세션에 남고 어떤 컴퓨터는 세션에 안남는게 문제다.

그래서 회사에 전화해봤다.

처음 전화했을때는 친절한 남자분이 받으셨는데 증상을 말씀드리고 서비스 등록정보 말씀드리고 우리꺼를 살펴보시다가

한번 인증 해보라고 하셔서 인증 해봤다.

"음 우리쪽에서는 문제가 없이 잘 처리가 되는 것 같은데요... 좀더 알아보고 연락드리겠습니다..."

예외상황을 처리한다는건 매우 귀찮고 삽질인것을 알기때문에 며칠기다리다가 다시 전화를 드렸다.

아마 연구원? 이신것같은데 어떤 까칠한 여성분께 상담을 받았다.

똑같이 증상을 말씀드렸다. 그러자 "음 근데 그 세션에 reqnum(키값)이 남는건 우리측 문제가 아닌것같음. 님쪽에서 처리해야함" 이러셨다.

흠 그래서 속으로 '조졌네' 이러고 끊으려는데 저쪽에서 reqnum을 랜덤으로 생성해서 세션유지하지말고 그냥 하드코딩해서 박아버리라는것이었다.

유레카 바로 그리했더니 처리됐다 ㅇㅇ 개똑똑하다.


기존 인증 모듈로 넘어가기전 클라이언트 측에서 랜덤 암호키를 생성하는 코드

String randomStrIpin = "";

for (int i = 0; i < numLengthIpin; i++) { //0 ~ 9 랜덤 숫자 생성 randomStrIpin += ranIpin.nextInt(10); } String reqNum = randomStrIpin;

위 라인을 그냥 요렇게 바꿔버리고

String reqNum = "jtowpjgrjgpjephprejohtpoej4towy43t";




서버측에서 세션에 저장된 랜덤으로 생성된 암호키를 불러오는 코드

//쿠키값 가져 오기
Cookie[] cookies = request.getCookies();
String tranjectionName = "";
String tranjectionReqNum = "";
/*if(cookies!=null){
for (int i = 0; i < cookies.length; i++){
Cookie c = cookies[i];
tranjectionName = c.getName();
tranjectionReqNum = c.getValue();
System.out.println("tranjectionName>>>>>"+tranjectionName);
System.out.println("tranjectionReqNum>>>>>"+tranjectionReqNum);
if(tranjectionName.compareTo("reqNumIpin")==0) break;

//tranjectionReqNum = "";
}
}*/
tranjectionReqNum = (String) session.getAttribute("reqNum");


에러나고나서 어떻게든 reqNum값 받아올려고 쿠키도 건들고 세션도 건들고 엄청 노력했음.

근데 그냥

String cookiereqNum = "jtowpjgrjgpjephprejohtpoej4towy43t"; 이러면 인증업체에 보낸 reqNum값과 서버측에서 복호화는 키값이 일치하여서 잘 작동함.

반응형
반응형

퀵서치라는건데 보통 텍스트 검색할때 Ctrl + H 눌러서 검색할 파일 확장자 적고 검색해서 나온 결과에서 또 뒤지고 답답했는데 이거 쓰면 엄청편하다.

하지만 여윽시 intellij Ctrl + Shift + F 가 최고인듯 ㄹㅇ

eclipse quick search에 대한 이미지 검색결과

설치 참고 http://javadeveloper.tistory.com/9







j레벨

이거는 ㄹㅇ 갓갓이다 외쳐 갓용호!

https://zeroturnaround.com/software/jrebel/

웹앱에서 서버단 java파일 수정 하자마자 바로바로 클래스파일에 반영이되고 돌아가는 로컬에서도 반영이 된다.

java말고 xml jsp 등 전부다 잘된다.

회사 주임님이 알려준건데 이거 쓰다보면 나중에는 디버깅모드도 귀찮아서 그냥 sysout(">>>>>>>>>>ovehear!!!!"+something); 이런식으로 디버깅모드를 안쓰게되고 야매처리하게된다고 초급개발자는 어찌보면 좀 피해야할수도 있다고 하셨다.


jrebel 설정후 서버 시작하면 처음에 이런 메시지가 나온다.

크 약 93시간이나 절약해준다고한다 무슨 원리인지는 모르겠지만 근데 자바파일을 엄청 자주 바꿨는데 그럴지도 모른다.

설정하기는 매우 귀찮은데 한번 설정하고나면 ㄹㅇ 없이 작업 못할꺼다 아마



크롬 툴이다.

폼 필러라고 현재 열려있는 페이지에서 모든 폼을 dummy data로 자동으로 채워준다

https://chrome.google.com/webstore/detail/form-filler/bnjjngeaknajbdcgpfkgnonkmififhfo

회사에서 일하다가 테스트용으로 이거쓰고있었는데 외국어가 들어가서 그런지

담당자분이 '님이거 누가 매크로써서 스패밍하는것같음 처리좀' 이랬다 ㅋㅋㅋ




크롬툴이다 TouchEn이다. 가끔씩 어쩔수없이 깔아야할때가 있는데 그럴때마다 설치하러가서 이 프로그램 사용자 리뷰를 본다. 꿀잼이다

https://chrome.google.com/webstore/detail/touchen-pc%EB%B3%B4%EC%95%88-%ED%99%95%EC%9E%A5/dncepekefegjiljlfbihljgogephdhph/reviews

이 프로그램을 만드는 라온시큐어라는 회사는 분명 팀의 내부 화합이 엄청 좋을것이다.

반응형