반응형

에러메세지 : was에서 안뜸

 

상황 : 파일 업로드 시 로컬에서는 정상작동 하나 서버에 올리니 controller에도 접근이 안되고 개발자도구에서 500 error 확인

 

원인 : was 서버 세팅에 로컬과 다르게 multipart context 설정이 안되어 있었음.

 

해결 : servers > was 서버 명 > context.xml에 추가 

<Context allowCasualMultipartParsing="true" path="/">

<Resources cachingAllowed="true" cacheMaxSize="100000" />

 

※ web.xml에 500 error 페이지 설정을 해놔서 

500 error 발생 시 에러 메세지에서 힌트를 얻을 수 없었음

500 error 페이지 설정을 걷어낸 후

개발자도구의 네트워크 > 500 error 발생한 url 클릭 > Response에서 하기의 오류 메세지를 보고 처리 할 수 있었음


"org.springframework.web.multipart.MultipartException: Could not parse multipart servlet request; nested exception is java.lang.IllegalStateException: 어떤 multi-part 설정도 제공되지 않았기 때문에, part들을 처리할 수 없습니다."

반응형
반응형

상황 : 로컬 서버에서 잘 돌아갔던 파일 업로드가 live 서버에서 정상 작동을 안함

 

에러 메세지 (was) : java.io.IOException: java.io.IOException: Unexpected output data

에러 발생 소스 : multipartFile.transferTo(l_file);

 

원인 : 서버에 디렉토리가 없거나, 소유자와 권한설정이 안되어있음

 

해결 방법 : 디렉토리와 권한 부여

반응형
반응형

error code

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
        at sun.security.ssl.Alerts.getSSLException(Alerts.java:192) ~[?:1.7.0_80]
        at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1904) ~[?:1.7.0_80]
        at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:279) ~[?:1.7.0_80]
        at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:273) ~[?:1.7.0_80]
        at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1446) ~[?:1.7.0_80]
        at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:209) ~[?:1.7.0_80]
        at sun.security.ssl.Handshaker.processLoop(Handshaker.java:913) ~[?:1.7.0_80]
        at sun.security.ssl.Handshaker.process_record(Handshaker.java:849) ~[?:1.7.0_80]
        at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1023) ~[?:1.7.0_80]
        at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1332) ~[?:1.7.0_80]
        at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1359) ~[?:1.7.0_80]
        at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1343) ~[?:1.7.0_80]
        at org.apache.http.conn.ssl.SSLConnectionSocketFactory.createLayeredSocket(SSLConnectionSocketFactory.java:275) ~[httpclient-4.3.4.jar:4.3.4]
        at org.apache.http.conn.ssl.SSLConnectionSocketFactory.connectSocket(SSLConnectionSocketFactory.java:254) ~[httpclient-4.3.4.jar:4.3.4]
        at org.apache.http.impl.conn.HttpClientConnectionOperator.connect(HttpClientConnectionOperator.java:123) ~[httpclient-4.3.4.jar:4.3.4]
        at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:318) ~[httpclient-4.3.4.jar:4.3.4]
        at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:363) ~[httpclient-4.3.4.jar:4.3.4]
        at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:219) ~[httpclient-4.3.4.jar:4.3.4]
        at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:195) ~[httpclient-4.3.4.jar:4.3.4]
        at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:86) ~[httpclient-4.3.4.jar:4.3.4]
        at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:108) ~[httpclient-4.3.4.jar:4.3.4]
        at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184) ~[httpclient-4.3.4.jar:4.3.4]
        at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82) ~[httpclient-4.3.4.jar:4.3.4]
        at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:106) ~[httpclient-4.3.4.jar:4.3.4]
        at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:57) ~[httpclient-4.3.4.jar:4.3.4]
        at egovframework.test.www.test.web.TestController.test123(TestController.java:137) [TestController.class:?]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.7.0_80]
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[?:1.7.0_80]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.7.0_80]
        at java.lang.reflect.Method.invoke(Method.java:606) ~[?:1.7.0_80]
        at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221) [spring-web-4.0.9.RELEASE.jar:4.0.9.RELEASE]
        at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) [spring-web-4.0.9.RELEASE.jar:4.0.9.RELEASE]
        at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104) [spring-webmvc-4.0.9.RELEASE.jar:4.0.9.RELEASE]
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:747) [spring-webmvc-4.0.9.RELEASE.jar:4.0.9.RELEASE]
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:676) [spring-webmvc-4.0.9.RELEASE.jar:4.0.9.RELEASE]
        at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) [spring-webmvc-4.0.9.RELEASE.jar:4.0.9.RELEASE]
        at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:938) [spring-webmvc-4.0.9.RELEASE.jar:4.0.9.RELEASE]
        at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870) [spring-webmvc-4.0.9.RELEASE.jar:4.0.9.RELEASE]
        at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961) [spring-webmvc-4.0.9.RELEASE.jar:4.0.9.RELEASE]
        at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852) [spring-webmvc-4.0.9.RELEASE.jar:4.0.9.RELEASE]
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:707) [javax.servlet_1.0.0.0_2-5.jar:2.5]
        at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837) [spring-webmvc-4.0.9.RELEASE.jar:4.0.9.RELEASE]
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) [javax.servlet_1.0.0.0_2-5.jar:2.5]
        at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227) [weblogic.jar:10.3.6.0]
        at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125) [weblogic.jar:10.3.6.0]
        at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:301) [weblogic.jar:10.3.6.0]
        at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:26) [weblogic.jar:10.3.6.0]
        at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:60) [BUG26519424_10360171017.jar:10.3.6.0]
        at org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:176) [urlrewritefilter-4.0.3.jar:4.0.3]
        at org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:145) [urlrewritefilter-4.0.3.jar:4.0.3]
        at org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:92) [urlrewritefilter-4.0.3.jar:4.0.3]
        at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:394) [urlrewritefilter-4.0.3.jar:4.0.3]
        at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:60) [BUG26519424_10360171017.jar:10.3.6.0]
        at com.github.ziplet.filter.compression.CompressingFilter.doFilter(CompressingFilter.java:263) [ziplet-2.3.0.jar:?]
        at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:60) [BUG26519424_10360171017.jar:10.3.6.0]
        at egovframework.com.cmm.filter.HTMLTagFilter.doFilter(HTMLTagFilter.java:35) [HTMLTagFilter.class:?]
        at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:60) [BUG26519424_10360171017.jar:10.3.6.0]
        at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) [spring-web-4.0.9.RELEASE.jar:4.0.9.RELEASE]
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.0.9.RELEASE.jar:4.0.9.RELEASE]
        at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:60) [BUG26519424_10360171017.jar:10.3.6.0]
        at weblogic.servlet.internal.RequestEventsFilter.doFilter(RequestEventsFilter.java:27) [weblogic.jar:10.3.6.0]
        at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:60) [BUG26519424_10360171017.jar:10.3.6.0]
        at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3748) [BUG26519424_10360171017.jar:10.3.6.0]
        at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3714) [BUG26519424_10360171017.jar:10.3.6.0]
        at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321) [com.bea.core.weblogic.security.identity_1.2.0.0.jar:1.2.0.0]
        at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120) [com.bea.core.weblogic.security.wls_1.0.0.0_6-2-0-0.jar:6.2.0.0]
        at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2283) [BUG26519424_10360171017.jar:10.3.6.0]
        at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2182) [BUG26519424_10360171017.jar:10.3.6.0]
        at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1499) [BUG26519424_10360171017.jar:10.3.6.0]
        at weblogic.work.ExecuteThread.execute(ExecuteThread.java:263) [BUG26519424_10360171017.jar:1.11.0.0]
        at weblogic.work.ExecuteThread.run(ExecuteThread.java:221) [BUG26519424_10360171017.jar:1.11.0.0]
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
        at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:385) ~[?:1.7.0_80]
        at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:230) ~[?:1.7.0_80]
        at sun.security.validator.Validator.validate(Validator.java:260) ~[?:1.7.0_80]
        at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:326) ~[?:1.7.0_80]
        at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:231) ~[?:1.7.0_80]
        at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:126) ~[?:1.7.0_80]
        at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1428) ~[?:1.7.0_80]
        ... 66 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
        at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:196) ~[?:1.7.0_80]
        at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:268) ~[?:1.7.0_80]
        at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:380) ~[?:1.7.0_80]
        at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:230) ~[?:1.7.0_80]
        at sun.security.validator.Validator.validate(Validator.java:260) ~[?:1.7.0_80]
        at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:326) ~[?:1.7.0_80]
        at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:231) ~[?:1.7.0_80]
        at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:126) ~[?:1.7.0_80]
        at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1428) ~[?:1.7.0_80]
        ... 66 more

상황 :  https -> https로 api 호출을 하였으나 상위 에러가 발생, JAVA API 호출시 ssl 에러
- 인증서 인증기관 검증 이슈가 의심되며 클라이언트 서버에 인증기관 목록이 부족하거나 호출하는 api 쪽의 웹서버에 등록된 인증서 체인이 완전하지 않을 수 있음.
- 인증서 확인 사이트에서 호출하는 api url을 검색해봤을 때 인증서 체인 연결에 빨간색 깨진 체인 표시가 확인
이러한 경우 클라이언트에서 중간 인증서까지 모두 가지고 있지 않으면 인증기관 검증이 정상적으로 이루어지지 않을 수 있음 (www.digicert.com/help/)

 

원인 : SSL은 연결하려는 api url의 인증서가 신뢰하는 인증기관 인증서 목록(keystore)에 없음

해결방안1 : api 서버에서 사용하는 사설 인증서를 호출하는 쪽 서버에 등록

해결방안2 : 호출하는쪽 서버에서 사용하는 공인 인증서 구매 및 api 서버에 등록

 

해결방안 2로 해결

반응형
반응형

poi를 활용한 엑셀 다운로드(다른 이름으로 저장) 폴더 및 파일 명 지정

 

서버 환경 
: java1.8
: 전자정부 프레임워크 - 개발자용 개발환경 32bit/64bit(Implementation Tool) Version 3.9.0 

: tomcat8

 

1. pom.xml에 Dependency 추가

<!-- Excel Read/Write 를 위한 Dependency 추가 -->
<dependency>
<groupId>org.apachepoi</groupId>
<artifactId>poi</artifactId>
<version>3.15</version>
</dependency>

 

 

2. devfootprint.tistory.com/56

 

전자정부프레임워크 maven 클린 프로젝트 클린 리빌드

war 파일 삭제 후 생성 프로세스 dependency 추가했을 경우 0. Maven > Update Project : pom.xml에 dependency를 내 로컬 pc에 다운로드 그렇지 않을 경우엔 0번 스킵해도 됨 1. 프로젝트 우클릭 > Run as..

devfootprint.tistory.com

3. java 소스

@RequestMapping(value = "/data/downloadDataInfo.do")
public void downloadDataInfo(@RequestParam HashMap<String, Object> commandMap, HttpServletResponse response) throws Exception {

    FileOutputStream fileOut = null;
    // Workbook 생성
    Workbook xlsWb = new HSSFWorkbook(); // Excel 2007 이전 버전
    String sheetname = "sheet1";
    Sheet sheet = xlsWb.createSheet(sheetname);
			
    Font font = xlsWb.createFont();
    font.setFontHeightInPoints((short)10);
    font.setFontName("맑은고딕");
			
    sheet.setColumnWidth(1, 50*256);
    CellStyle style = xlsWb.createCellStyle();
    style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
			
    Row row = null;
    Cell cell = null;
                    
    // 첫번째 행추가
    row = sheet.createRow(0);
    row.setHeight((short)500);
            
    // 첫번째행에 첫번째 컬럼 값 생성
    cell = row.createCell(0);
    cell.setCellValue("test1");
    cell.setCellStyle(style);

    // 첫번째행에 두번째 컬럼 값 생성
    cell = row.createCell(1);
    cell.setCellValue("test2");
    cell.setCellStyle(style);            
            
	         
    response.setContentType("application/octet-stream;");
    response.setHeader("Content-Disposition", "attachment; filename=\"" + new String(filename.getBytes(), "UTF-8") + "\"");
    response.setHeader("Pragma", "no-cache;");
    response.setHeader("Expires", "-1;");

    // excel 파일 저장
    try {
        fileOut = new FileOutputStream("test.xls");
        xlsWb.write(response.getOutputStream());
        fileOut.flush();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if(fileOut != null) {
            fileOut.close();
        }
    }
}
반응형
반응형

war 파일 삭제 후 생성 프로세스
dependency 추가했을 경우 
0. Maven > Update Project : pom.xml에 dependency를 내 로컬 pc에 다운로드
그렇지 않을 경우엔 0번 스킵해도 됨


1. 프로젝트 우클릭 > Run as > Maven Clean : target 폴더 및 war 파일 삭제 
2. 상단 메뉴바 > Project > Clean... > Start a build immediately , Build only the selected project > Clean  : 프로젝트 클린 후 선택 한 프로젝트만 재빌드
3. 프로젝트 우클릭 > Run as > Maven install : target폴더 밑에 war 파일 생성

반응형
반응형

1. 개요 

- 일반 log4j2설정으로는 원하는 로그를 설정할 수 없음

- client가 많은 서비스에서 쿼리까지 보는데 log가 많이 쌓임

- 서비스 구동하는 동안 request count가 필요했음

- requset한 parameter, client 브라우저등 과 같은 커스텀한 log를 만들고 싶었음

 

2. 설정 방법

- request가 들어올때 servlet에서 url mapping 전에 interceptor를 먼저 탐 이를 이용하여 log 설정을 진행(interceptor를 활용하여 주로 로그인 권한을 체크함) 

- servlet 설정에서 interceptor 추가

  • 경로 : 서비스명\src\main\webapp\WEB-INF\config\egovframework\springmvc\egov-com-servlet.xml

  • 소스 추가 :

    <mvc:interceptors>

        <mvc:interceptor>

            <mvc:mapping path="/**" />

           <bean class="egovframework.com.cmm.interceptor.LoggerInterceptor" />

        </mvc:interceptor>

    </mvc:interceptors>

 

 

- bean class에 명시한 경로에 java file 생성

  • 경로 : 서비스명\src\main\java\egovframework\com\cmm\interceptor\LoggerInterceptor.java

  • 소스 추가 :

package egovframework.com.cmm.interceptor;

import java.net.InetAddress;

import java.text.SimpleDateFormat;

import java.util.Date;

import java.util.Enumeration;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;

import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import egovframework.service.util.NetworkUtil;

/**

 * 로그용 인터셉터

 * @author

 * @since

 * @version 1.0

 * @see

 */

public class LoggerInterceptor extends HandlerInterceptorAdapter {

     // 로그 고유번호 변수선언 및 초기화

     public long lognumber = 0;

    

     @Override

     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

           // 인터셉터 접근 시 로그 고유번호 증가

           lognumber++;

           

           // request 객체에 로그 고유 번호 set

           request.setAttribute("requestLogId", lognumber);

           

           // 로그에 담을 서버 현재 날짜 및 시간 세팅

           // 날짜 포맷 지정

           SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

           // 서버의 현재 날짜 객체 생성

           Date date = new Date();

           // 날짜 포맷 형태로 서버 현재 날짜 및 시간 변수 선언 및 초기화

           String requestTime = dateFormat.format(date);

     

           // client의 브라우저 명칭을 담을 변수 선언 및 초기화

           String browser ="";

           

           // client header에서 브라우저 언어를 담을 변수 선언 및 초기화

           String acceptLang = request.getHeader("Accept-Language");

           

           // client의 브라우저 언어를 담을 변수 선언

           String browserLanguage = "No Data";

           

           // header에 브라우저 언어가 있을경우 분기 처리

           if(acceptLang != null){

                // header에서  브라우저 언어 추출

                browserLanguage = acceptLang.split(",")[0];

           }

           

           try {

                // client header에서 브라우저 정보를 담을 변수 선언 및 초기화

                String browserInfo = request.getHeader("User-Agent"); // 사용자 User-Agent 값 얻기

                // header에 브라우저 정보가 있을 경우 분기 처리

                if (browserInfo != null) {

                     // header에서 Trident 문자열이 있을 경우 브라우저 언어는 Internet Explore

                     if (browserInfo.indexOf("Trident") > -1) {

                           browser = "MSIE";

                     // header에서 Chrome 문자열이 있을 경우 브라우저 언어는 Internet Explore

                     } else if (browserInfo.indexOf("Chrome") > -1) {

                           browser = "Chrome";

                     // header에서 Opera 문자열이 있을 경우 브라우저 언어는 Internet Explore

                     } else if (browserInfo.indexOf("Opera") > -1) {

                           browser = "Opera";

                     // header에서 Firefox 문자열이 있을 경우 브라우저 언어는 Internet Explore

                     } else if (browserInfo.indexOf("Firefox") > -1) {

                           browser = "Firefox";

                     // header에서 iPhone 문자열이 있을 경우 브라우저 언어는 Internet Explore

                     } else if (browserInfo.indexOf("iPhone") > -1 && browserInfo.indexOf("Mobile") > -1) {

                           browser = "iPhone";

                     // header에서 Android 문자열이 있을 경우 브라우저 언어는 Internet Explore

                     } else if (browserInfo.indexOf("Android") > -1 && browserInfo.indexOf("Mobile") > -1) {

                           browser = "Android";

                     }

                }

           } catch (Exception e) {

                e.printStackTrace();

           }

           

           // client IP를 담을 변수 선언 및 초기화

           // client IP가 아닌 서버 IP를 담는 이슈로 인해 정상 처리를 위한 함수 호출

           String clientIp = NetworkUtil.getClientIpAddr(request);

           

           // request method를 담을 변수 선언 및 초기화

           String requestMethod = request.getMethod();

           

           // request한 uri를 담을 변수 선언

                           // request한 프로토콜 명

           String uri = request.getScheme() + "://" +

                           // request한 서버 이름

                           request.getServerName() +

                           // request한 스키마가 http이면서 80포트이거나, request 스키마가 https이면서 443포트인 경우 포트 생략 아닐 경우 :포트번호 추가

                           ("http".equals(request.getScheme()) && request.getServerPort() == 80 || "https".equals(request.getScheme()) && request.getServerPort() == 443 ? "" : ":" + request.getServerPort() ) +

                           // request한 uri

                           request.getRequestURI() +

                           // request한 쿼리가 있으면 쿼리 스트링의 시작을 알리는 ?와 쿼리스트링 추가 없을경우 빈값

                           (request.getQueryString() != null ? "?" + request.getQueryString() : "");

           

           // 서버 ip를 담을 변수 선언 및 초기화

           // 현재 서버의 localhost명을 담을 변수 선언 및 초기화

           InetAddress address = InetAddress.getLocalHost();

           // 서버 ip를 담을 변수 선언 및 초기화

           String serverIp = address.getHostAddress();

           

           // request된 파라미터를 정리하여 log로 뿌려줄 변수 선언 및 초기화

           String params ="";

           

           // request된 파라미터를 담을 변수 선언 및 초기화

           Enumeration param = request.getParameterNames();

           

           // request된 param가 있을 때까지 반복

           while(param.hasMoreElements()){

                // request된 파라미터의 이름을 담을 변수 선언 및 초기화

                String name = (String)param.nextElement();

                // request된 파라미터의 값을 담을 변수 선언 및 초기화

                String value = request.getParameter(name);

                // value값이 있을 경우 params 변수에 이름:값 탭을 추가

                if(null != value && !"".equals(value)){

                     params += (name+":"+value+"\t");

                }

           }

        // 로그 정리

          System.out.println("\n\n=========================================\tREQUEST START\t=========================================");

           System.out.println(" Log ID \t:  " +request.getAttribute("requestLogId"));

           System.out.println(" Request Time \t:  "+ requestTime);

           System.out.println(" BrowserLanguage:  " + browserLanguage);

           System.out.println(" BrowserInfo \t:  " + browser);

           System.out.println(" Client IP \t:  " + clientIp);

           System.out.println(" Method \t:  " + requestMethod);

           System.out.println(" Request URL \t:  "+ uri);

           System.out.println(" Server IP \t:  "+ serverIp);

           System.out.println(" Parameters \t:  " + params);

          System.out.println("=========================================\tREQUEST END\t\t=========================================\n\n");

           

           // request된 intercepter 종료

           return super.preHandle(request, response, handler);

     }

     

     public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

           // 로그에 담을 서버 현재 날짜 및 시간 세팅

           // 날짜 포맷 지정

           SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

           // 서버의 현재 날짜 객체 생성

           Date date = new Date();

           // 날짜 포맷 형태로 서버 현재 날짜 및 시간 변수 선언 및 초기화

           String responseTime = dateFormat.format(date);

           

           // request한 uri를 담을 변수 선언

                           // request한 프로토콜 명

           String uri = request.getScheme() + "://" +

                           // request한 서버 이름

                           request.getServerName() +

                           // request한 스키마가 http이면서 80포트이거나, request 스키마가 https이면서 443포트인 경우 포트 생략 아닐 경우 :포트번호 추가

                           ("http".equals(request.getScheme()) && request.getServerPort() == 80 || "https".equals(request.getScheme()) && request.getServerPort() == 443 ? "" : ":" + request.getServerPort() ) +

                           // request한 uri

                           request.getRequestURI() +

                           // request한 쿼리가 있으면 쿼리 스트링의 시작을 알리는 ?와 쿼리스트링 추가 없을경우 빈값

                           (request.getQueryString() != null ? "?" + request.getQueryString() : "");

           

           // 로그 정리

          System.out.println("\n\n=========================================\tRESPONSE START\t=========================================");

           System.out.println(" Log ID \t:  " + request.getAttribute("requestLogId"));

           System.out.println(" Response Time \t:  "+ responseTime);

           System.out.println(" Request URL \t:  "+ uri);

           // java 버전 이슈로 인해 response객체의 status값(200, 403 ... )을 받아오지 못해 주석 처리

           // System.out.println(" Response status:  " + response.getStatus());

          System.out.println("=========================================\tRESPONSE END\t\t=========================================\n\n");

           

           // response된 intercepter 종료

           super.postHandle(request, response, handler, modelAndView);

     }     

}

 

 

3. 단점

- log가 여러줄로 처리되어 다른 log와 중첩되어 보여지는 경우가 간혹 발생하며, 

서버 side에서 늦게 처리되는경우 request와 respone를 각각 확인하기 어려운 경우가 있음

반응형
반응형

ajax 통신으로 파라미터를 아래과 같은 형식으로 controller에서 받아서 로직을 처리할 일이 생겼다.
(한 번에 여러건의 데이터 업데이트를 하기 위해서 한번에 파라미터를 전송해야했음)

[{key:value,  ... , key:value}, {key:value,  ... , key:value} ] 

결론부터 말하면 포기했었었었었지만 2021년 신규 posting




1. 데이터 형태
일자
시작시간
종료시간
장소(시도)
장소(군구)
2018-01-01
1:00
2:00
서울시
강남구
2018-01-02
3:00
5:00
서울시
강북구
2018-01-03
12:00
15:00
서울시
영등포구

2. 보낼데이터 만들기
var l_arr = new Array();

$("#popup_layer .table_body tr").each(function(p_index, p_item){
   if($(this).attr("data-no")){
       no           = $(this).attr("data-no");
       date         = $(this).children().children("input[name='date']");
       starttime    = $(this).children().children("input[name='starttime']");
       endtime      = $(this).children().children("input[name='endtime']");
       sidocode     = $(this).children().children().children("#sido");
       sigungucode  = $(this).children().children().children("#sigungu");
      

       l_arr.push(
            {"no"              : no,
            "date"             : date.val(),
            "starttime"        : starttime.val(),
            "endtime"          : endtime.val(),
            "sidocode"         : sidocode.val(),
            "sigungucode"      : sigungucode.val()
            }
       )
   }
});


3. 데이터 보내기 1차 시도
    javascript 소스

    $.ajax({
        url : '/test.do',
        dataType : 'text',
        type : 'POST',
        data : {'arr' : l_arr},
        success : function(l_resultvalue) {

        }
    });

    java 소스
    @RequestMapping("/test.do")
    public ModelAndView saveInfoAjax(HttpServletRequest request, HttpServletResponse response) throws Exception {
        String param = request.getParameterValues(arr);
    }

    결과 : 파라미터를 받을 수가 없었음



4. 데이터 보내기 2차 시도 (구글 검색 후 배열을 map으로 파싱)
    @RequestMapping("/test.do")
    public ModelAndView saveInfoAjax(HttpServletRequest request, HttpServletResponse response) throws Exception {
        @SuppressWarnings("rawtypes")
        Enumeration enums = request.getParameterNames();
                  
        while(enums.hasMoreElements()){
           String paramName = (String)enums.nextElement();
           Map<String, Object> paramMap = new HashMap<String, Object>();
                  
           paramMap.put(paramName, request.getParameterValues(paramName));
                  
           String[] parameters = request.getParameterValues(paramName);
           // Parameter가 배열일 경우
           if(parameters.length > 1){
               List<Object> parmList = new ArrayList<Object>();
                   for(int i= 0; i<parameters.length;i++){
                       parmList.add(parmList.size(), parameters[i]);
                   }
                   parameterMap.put(paramName, parmList);
           }
        }
        System.out.println(parameterMap);
    }



    결과 :  데이터 형태가 이상하게 옴

    arr_appointment_info[0][no]
    arr_appointment_info[0][date]
    arr_appointment_info[0][starttime]
    arr_appointment_info[0][endtime]
    arr_appointment_info[0][sidocode]
    arr_appointment_info[0][sigungucode]
    arr_appointment_info[1][no]
    arr_appointment_info[1][date]
    arr_appointment_info[1][starttime]
    arr_appointment_info[1][endtime]
    arr_appointment_info[1][sidocode]
    arr_appointment_info[1][sigungucode]



5. 데이터 보내기 3차 시도(@RequestBody로 받아보기)

    javascript 소스

    $.ajax({
        url : '/test.do',
        contentType : 'application/json',
        processData : 'false',
        dataType : 'json',
        type : 'POST',
        data : JOSN.stringify({'arr' : l_arr}),
        success : function(l_resultvalue) {

        }
    });


    java 소스
    @RequestMapping("/test.do")
    public ModelAndView saveInfoAjax(HttpServletRequest request, HttpServletResponse response, @RequestBody HashMap<String, Object > params) throws Exception {
        System.out.println(params);
    }


    결과 : java 에러 발생 파라미터 자체가 안받아짐
    java 에러 :  org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported

    java 에러 해결이 안됨 
            에러 해결 시도 1 (dependency 추가) : 같은 에러 발생 실패
            <dependency>
                  <groupId>com.fasterxml.jackson.core</groupId>
                  <artifactId>jackson-core</artifactId>
                  <version>2.9.3</version>
              </dependency>
      
              <dependency>
                  <groupId>com.fasterxml.jackson.core</groupId>
                  <artifactId>jackson-annotations</artifactId>
                  <version>2.9.3</version>
              </dependency>
      
              <dependency>
                  <groupId>com.fasterxml.jackson.core</groupId>
                  <artifactId>jackson-databind</artifactId>
                  <version>2.9.3</version>
                  <exclusions>
                      <exclusion>
                          <artifactId>jackson-annotations</artifactId>
                          <groupId>com.fasterxml.jackson.core</groupId>
                      </exclusion>
                  </exclusions>
              </dependency>

            에러 해결 시도 2 (Ajax에서 옵션추가 및 변경)  :같은 에러 발생 실패
                     contentType : 'application/json',
          processData : 'false',
          url : '/test.do',
          dataType : 'json',
          data : JOSN.stringify({'arr' : l_arr}),

            에러 해결 시도 3 (@RequestParam어노테이션 사용 ) :같은 에러 발생 실패
                    java 소스
            @RequestMapping("/test.do")
            public ModelAndView saveInfoAjax(HttpServletRequest request, HttpServletResponse response, @RequestParam HashMap<String, Object > params) throws Exception {
                System.out.println(params);
            }




6. 결국 데이터를 다른방식으로 전송
    javascript 소스
     var l_param_string = "";

    $("#popup_layer .table_body tr").each(function(p_index, p_item){
       if($(this).attr("data-no")){
           no           = $(this).attr("data-no");
           date         = $(this).children().children("input[name='date']");
           starttime    = $(this).children().children("input[name='starttime']");
           endtime      = $(this).children().children("input[name='endtime']");
           sidocode     = $(this).children().children().children("#sido");
           sigungucode  = $(this).children().children().children("#sigungu");
      
    
          // 순서 중요
          l_param_string +=
          vibmatchno+","+
          apppointmentdate.val()+","+
          appointmentstarttime.val()+","+
          appointmentendtime.val()+","+
          appointmentsidocode.val()+","+
          appointmentsigungucode.val()+","+
          appointmentaddresskr.val()+","+
          appointmentaddressen.val()+"|"
       }
    });

    $.ajax({
        url : '/test.do',
        dataType : 'text',
        type : 'POST',
        data : {'param_string' :l_param_string},
        success : function(l_resultvalue) {
            try{
                var l_result_value = eval('(' + l_resultvalue + ')');
                if(l_result_value.resultcode > 0) {
                    alert(l_result_value.resultmessage);
                }
            } catch(e) {
                alert(e);
            }
        }
    });


java 소스 
      @RequestMapping("/test.do")
    public ModelAndView saveInfoAjax(HttpServletRequest request, HttpServletResponse response) throws Exception {
                 // split 시 |, \\|로는 정상적으로 안쪼개짐 [|] 로 해야 정상적으로 쪼개짐
String value = request.getParameter(param_string).split("[|]");
        String setParamString[];
        if(paramString.length > 0){
            int updateResultCnt = 0;
            for(int i = 0 ; i < paramString.length; i++){
                setParamString = paramString[i].split(",");
                        
                paramMap.put("vno",setParamString[0]);
                paramMap.put("date",setParamString[1]);
                paramMap.put("starttime",setParamString[2]);
                paramMap.put("endtime",setParamString[3]);
                paramMap.put("sidocode",setParamString[4]);
                paramMap.put("sigungucode",setParamString[5]);                        
                        
                updateResultCnt += Service.updateTest(paramMap);
                    if(updateResultCnt < i+1){
                        mv.addObject("resultcode", -1);
                        mv.addObject("resultmessage", "Update Fail");
                        return mv;
                    }
           }
           mv.addObject("resultcode", 1);
           mv.addObject("resultmessage", "Update Success");
        }
            
        return mv;
    }

반응형
반응형

에러 메시지 :
org.springframework.beans.factory.NoSuchBeanDefinitionException:  No bean named 'XxxxxService' is defined 

원인 : Service 객체를 찾지 못하는 에러
1) Resource명과 Service명 불일치 or 어노테이션 정의 안됨
2) resource폴더가 deploy되지 않음
3) dispatcher-servlet.xml 설정 
4) 메이븐빌드 오류

해결 방법
1) XxxxImpl. java의 @Service("XxxxService")와 
XxxxController.java의 @Resource(name="XxxxService") 확인 (대소문자 구분)

2) 프로젝트 > Properties > Deployment Assembly 선택
Bold 표시 항목 추가
     Source                    |     Deploy Path
    /src/main/java               WEB-INF/classes
    /src/main/resource         WEB-INF/classes
    /src/main/webapp          /

3) context-common.xml 파일 확인
<context:component-scan base-package="egovframework">
  <context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/>
  <context:include-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
  <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
 </context:component-scan> 
base-package는 내 패키지에 맞춰주고, Service와 Repository관련 annotation을 include

4) 프로젝트 clean, 메이븐 clean 
메이븐 빌드할때 goal에 "clean install war:inplace"

※ 평상시에 잘됐는데 갑자기 생기는 오류 일경우 4)일 가능성이 높음



반응형
반응형

에러 메시지 : 
 java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for  xxxMapper


원인 :  Mapper XML에서 해당 쿼리를 찾지 못하는 현상 (Mapper XML을 찾지 못하는 문제)

1. mapper id가 다를경우
   - mapper파일(MyBatis의 쿼리문을 등록한 XML파일)에 <select id=''.. 에 id와 
     mapper파일에 직접 접근하는 java파일(DAO나 service)에 적어놓은 id값이 다른 경우 

2. Parameter와 bean의 필드명이 틀린 경우

3. mapper파일(MyBatis의 쿼리문을 등록한 XML파일)에 정의된 네임스페이스(namespace)와 
   mapper파일에 직접 접근하는 java파일(DAO나 service)에서 호출하는 네임스페이스(namespace)가 다를 경우

4. MyBatis config파일에 mapper가 정의가 되어 있지 않거나 Spelling이 틀린 경우

5. mapper에 정의된 namespace 명칭이 같은 Application 내에 중복 될 경우

6. bulid가 안된경우


반응형
반응형

에러 메시지 :  
java.lang.IllegalStateException: Current request is not of type [org.springframework.web.multipart.MultipartHttpServletRequest]: org.apache.catalina.connector.RequestFacade@****
  
원인 :   
요청 할때 MultipartHttpServletRequest 요청이 아니기 때문에 발생 .

해결 :
- submit하는 form enctype multipart/form-data 인지 확인.
- controller에서 MultipartHttpServletRequest를 HttpServletRequest로 받아서 처리





반응형

+ Recent posts