반응형

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();
        }
    }
}
반응형
반응형

테이블에 있는 list를 ajax통신을 통해 java로 넘기기 list<Map<String, Object>> 형식

 

 

데이터 형태

{codeArrObj=[
{"newcode":"0001","newcodename":"A 1","codetype":"acode","beforecode":"0001"},
{"newcode":"0002","newcodename":"B","codetype":"acode","beforecode":"0002"},
{"newcode":"0003","newcodename":"C","codetype":"acode","beforecode":"0003"},
{"newcode":"0004","newcodename":"D","codetype":"acode","beforecode":"0004"},
{"newcode":"9999","newcodename":"1234","codetype":"acode","beforecode":"9999"}]
}

 

html 코드 input 값에 있는 여러개의 행 데이터를 java로 넘겨서 update 또는 insert 하고 싶다. 

id name속성이 없어도됨

<input type="hidden" id="codeType" name="codeType" value="${Code[0].codetype}"/>
<table class="table table-striped jambo_table bulk_action" id="codeList_table">
    <thead>
        <tr class="headings">
            <th class="column-title">코드</th>
            <th class="column-title">코드 명</th>
        </tr>
    </thead>
    <tbody>
        <c:forEach var="item" items="${Code}" varStatus="status">
            <tr>
                <td>
                    <input type="text" value="${item.code}" />
                </td>
                <td>
                    <input type="text" value="${item.codename}"/>
                    <input type="hidden" value="${item.code}"/>
                </td>
            </tr>
        </c:forEach>
    </tbody>
</table>

 

javascript 소스 (jQuery)

// ajax controller 매핑용 url을 변수에 담음
var l_url = "/admin/saveCodeAjax.do";
// array 변수 초기화
var codeArr = [];
// object 변수 초기화
var dataObj={};

//원하는 데이터의 형태
/*	
*	{codeArrObj=[
*		{"newcode":"0001","newcodename":"A 경로당 ","codetype":"agencycode","beforecode":"0001"},
*		{"newcode":"0002","newcodename":"B 경로당","codetype":"agencycode","beforecode":"0002"},
*		{"newcode":"0003","newcodename":"C 경로당","codetype":"agencycode","beforecode":"0003"},
*		{"newcode":"0004","newcodename":"D 경로당","codetype":"agencycode","beforecode":"0004"},
*		{"newcode":"9999","newcodename":"1234","codetype":"agencycode","beforecode":"9999"}]
*	}
*/

// for문으로 데이터 생성
for (var i = 0 ; i < $("#codeList_table tbody tr").length; i++){
    // 행 별로 첫번째 input 값을 찾아서 newcode로 초기화 
    var newcode = $("#codeList_table tbody tr").eq(i).children().children().eq(0).val();
    // 행 별로 두번째 input 값을 찾아서 newcode로 초기화 
    var newcodename = $("#codeList_table tbody tr").eq(i).children().children().eq(1).val();
    // 행 별로 세번째 input 값을 찾아서 newcode로 초기화 
    var beforecode = $("#codeList_table tbody tr").eq(i).children().children().eq(2).val();

    // object에 newcode라는 key로 newcode 값 바인딩
    dataObj.newcode = newcode;
    // object에 newcodename라는 key로 newcodename 값 바인딩
    dataObj.newcodename= newcodename;
    // object에 codetype라는 key로 codetype 값 바인딩
    dataObj.codetype= $("#codeType").val();
    // object에 beforecode라는 key로 beforecode 값 바인딩
    dataObj.beforecode= beforecode;

    // array에 object push
    codeArr.push(dataObj);

    // push 후 초기화 해주지 않으면 같은 object로 loop 만큼 push됨 
    dataObj ={};
}

// ajax controller에서 처리할 파라미터를 변수에 담음(json형태)
var jsonData = JSON.stringify(codeArr);

$.ajax({
    url        : l_url,
    type       : "POST",
    dataType   : 'json',
    data       : {codeArrObj : jsonData},
    success    : function(p_resultvalue) {
        $(".evaluation_data").attr('disabled', true);
        alert(p_resultvalue.result_msg);
    }
});

 

java 코드

// 코드 저장하기
@Override
public int saveCodeAjax(HashMap<String, Object> commandMap) throws Exception {
    // codeArrObj를 JSONarray 타입으로 형변환 
    JSONArray array = JSONArray.fromObject(commandMap.get("codeArrObj"));

    // 모든 코드의 결과 값 저장을 위한 초기화
    int[] results= new int[array.size()];

    // 최종 결과값 (정상 저장 될 경우 1로 리턴)
    int result=1;

    // JSONarray타입에 저장된 값 처리
    for(int i=0; i<array.size(); i++){
        // array 안의 값을 object로 세팅
        JSONObject obj = (JSONObject)array.get(i);

        // mybatis에 파라미터로 넘겨줄 map 타입 초기화
        Map<String, Object> resendMap = new HashMap<String, Object>();

        // object의 이전코드명을 파라미터로 세팅(update 해야할 경우를 위해 필요)
        resendMap.put("beforecode", obj.get("beforecode"));
        // object의 코드타입을 파라미터로 세팅(어떤 코드 저장인지 파악을 위해 필요)
        resendMap.put("codetype", obj.get("codetype"));
        // object의 신규코드를 파라미터로 세팅(코드 저장을 위해 세팅)
        resendMap.put("newcode", obj.get("newcode"));
        // object의 신규코드명을 파라미터로 세팅(코드 저장을 위해 세팅)
        resendMap.put("newcodename", obj.get("newcodename"));


        results[i] = DAO.insertCode(resendMap);

        // for문 내부에서 한 코드 업데이트, 인서트가 발생했을경우 
        // 한 건이라도 실패(0)가 나오면 결과값은 0이 됨 
        result *= results[i];
    }

    return result;
}

 

 

반응형
반응형

어플리케이션 배포 특정 페이지만 404 error

서버 환경 
: 네이버 클라우드 플렛폼
: mysql(5.7)-centos-7.2-64 서버 사용
: tomcat 8
: java-1.8.0-openjdk-1.8.0.275.b01-0.el7_9.x86_64
: 전자정부 프레임워크 - 개발자용 개발환경 32bit/64bit(Implementation Tool) Version 3.9.0
: web, was, DB가 한 서버에 있음

1. 늘 그렇듯 배포전 로컬서버에서는 잘 돌아감.
2. /usr/local/tomcat8/conf/server.xml에서 path 설정과 docBase 설정, source 설정을 완벽하게 구성함
3. 특정 페이지 (로그인, 코드 조회 등)는 정상 호출 및 action이 되나 대부분의 페이지는 통신 status가 404
4. 로그상에는 아무것도 안찍힘 (log4j의 레벨을 전부 DEBUG로 수정 배포)
- /usr/local/tomcat8/logs/catalina.2021-01-13.log
5. access 로그상에는 404가 떨어짐 
- /usr/local/tomcat8/logs/localhost_access_log.2021-01-13.txt
6. 인코딩 이슈인 줄 알고 
- /usr/local/tomcat8/conf/server.xml connector에  URIEncoding="UTF-8" 적용
- /usr/local/tomcat8/conf/web.xml filter 태그 추가

<filter>  
    <filter-name>setCharacterEncodingFilter</filter-name>  
    <filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class>  
    <init-param>  
        <param-name>encoding</param-name>  
        <param-value>UTF-8</param-value>  
    </init-param>  
    <async-supported>true</async-supported>  
</filter> 


7. 권한 이슈인줄 알고 centos내에서 tomcat user와 group 생성, service 생성하여 톰캣을 구동시켰음에도 변화가 없음
8. 우연히 /usr/local/tomcat8/logs/폴더의 파일 중 catalina.out 파일을 tail을 걸어 보니
4번에서 안찍히던 로그가 보임
### Cause: java.sql.SQLSyntaxErrorException: Table 'sa_db.S_USER' doesn't exist
; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException:Table 'sa_db.S_USER' doesn't existexist
9. DB 스키마 설정 및 테이블 데이터를 생성하여 분명 select 하고 배포를 했는데 저런 에러가 떨어짐
10. mysql에서 select * from S_USER를 조회 하니 조회가 안됨
11. 테이블 조회 시 대소문자 구분을 함
12. 테이블 생성 시 테이블명과 컬럼명을 소문자로 생성하였고, 조회를 대문자 테이블명으로 하니 안됨
(희안하게 대문자 컬럼명은 조회 가능)
테이블 명 소문자로 변경 후 배포하니 정상작동

※ 아마 mysql 버전별 테이블의 대소문자를 가리는 이슈일것 같음


※ 로컬 환경에서 잘돌아가서 소스는 문제 없다고 판단, was 로그 확인을 소홀히 했다.
아니 어떤게 찐 was 로그인지 몰랐다. 에러 발생하면 무조건 로그를 확인하자.

 

반응형
반응형

네이버 클라우드 web was db 서버 한 서버로 구축하기-3
Ⅰ. 서버 생성 및 접속
Ⅱ. 서버 접속
Ⅲ. JDK 설치
Ⅳ. tomcat 설치
Ⅴ. 파일 배포
Ⅵ. 서버 실행

https://devfootprint.tistory.com/59

 

네이버 클라우드 web was db 서버 한 서버로 구축하기-1

네이버 클라우드 web was db 서버 한 서버로 구축하기-1 Ⅰ. 서버 생성 및 접속 Ⅱ. 서버 접속 Ⅲ. JDK 설치 Ⅳ. tomcat 설치 Ⅴ. 파일 배포 Ⅵ. 서버 실행 ※ 생성할 서버 스펙 : mysql..

devfootprint.tistory.com

이전 내용 (네이버 클라우드 web was db 서버 한 서버로 구축하기-1)

 

devfootprint.tistory.com/60

 

네이버 클라우드 web was db 서버 한 서버로 구축하기-2

네이버 클라우드 web was db 서버 한 서버로 구축하기-2 Ⅰ. 서버 생성 및 접속 Ⅱ. 서버 접속 Ⅲ. JDK 설치 Ⅳ. tomcat 설치 Ⅴ. 파일 배포 Ⅵ. 서버 실행 ※ 생성할 서버 스펙  : mysql(5.7)-..

devfootprint.tistory.com

이전 내용 (네이버 클라우드 web was db 서버 한 서버로 구축하기-2)

 

 

 

 

 

1. 파일 질라(FTP 프로그램)1. 전자정부 프레임워크에서 war 파일로 패킹하기
url : devfootprint.tistory.com/56

 

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

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

devfootprint.tistory.com

 

2. 내 PC에 파일 질라(FTP 프로그램) 설치
설치 url : filezilla-project.org/download.php?type=client

 

Download FileZilla Client for Windows (64bit)

Download FileZilla Client for Windows (64bit) The latest stable version of FileZilla Client is 3.52.0.5 Please select the file appropriate for your platform below. Please select your edition of FileZilla Client FileZilla FileZilla with manual FileZilla Pro

filezilla-project.org

 

3. 네이버 클라우드 서버에 ftp 설치
※ 이 단계에서 너무 막혀서 이런저런 시도가 많았으나 이슈는 호스트명과 포트를 잘 못 입력 했음을 알았다.
ftp가 이미 설치가 되어있어서 구동이 안되어 삭제했다가 다시 깔기도했으며 이런저런 설정도 바꾸어보았으나,
기록이 안되어있다....
 
기억나는대로 적어보겠다.

- 기존 설정 파일이 있는 폴더로 이동
명령어 # cd /etc/vsftpd/

- 기존 설정파일 백업
명령어 # mv vsftpd.conf vsfptd.conf_bak

-- 설정파일 열기
명령어 # vi /etc/vsftpd/vsftpd.conf 
하단에 추가
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_file=/var/log/xferlog
xferlog_std_format=YES
chroot_local_user=YES
listen=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
allow_writeable_chroot=YE
pasv_enable=YES
pasv_min_port=40000
pasv_max_port=40000
listen_port=21
listen=YES
pasv_address=네이버 클라우드에 공인 IP 입력

vi /etc/vsftpd/ftpusers
root 제거

vi /etc/vsftpd/user_list
root 제거

 

4. FTP 붙기
- 내 PC에 파일 질라(FTP 프로그램) 실행
- 상단 메뉴에서 파일 > 사이트 관리자
프로토콜 : SFTP - SSH File Transfer Protocol
호스트 : 네이버 클라우드 서버에 포트포워딩 정보에 나와있는 서버접속용 공인 ip 입력 
포트 : 네이버 클라우드 서버에 포트포워딩 정보에 나와있는 외부포트 입력 
사용자 : root
비밀번호 : 네이버 클라우드에서 서버 우클릭 > 관리자 비밀번호 확인 > pem파일 upload 후 나오는 비밀번호 입력

 

5. 파일질라에서 war 파일 배포
- 파일 질라 좌측(내 PC)에서 war패킹된 경로로 이동
- 파일 질라 우측(네이버 클라우드 서버)에서 /usr/local/tomcat8/webapps/로 이동 후 프로젝트 명으로 폴더 생성
- war 패킹된 파일을 우측에 생성된 폴더로 복사
- putty에서 압축해제
명령어 # cd /usr/local/tomcat8/webapps/프로젝트 명/ 
명령어 # unzip war패킹파일명.war

 

6. putty에서 tomcat 설정 변경
- 배포한 파일 경로 설정
명령어 # vi  /usr/local/tomcat8/conf/server.xml

<Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="true">
host 태그 내부에 하기의 내용 추가
<Context path="/" docBase="프로젝트 명" reloadable="false" source="org.eclipse.jst.jee.server:프로젝트 명" />

 

7. putty에서 8080포트를 80포트로 변경
명령어 # iptables -t nat --append PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080



8. putty에서 tomcat 서버 구동
명령어 # cd /usr/local/tomcat8/bin
명령어 # startup.sh

 

9. 내 pc에서 배포한 웹 페이지 접속
브라우저에서 네이버 클라우드 서버에 공인 IP(Instance ID) 입력

반응형
반응형

네이버 클라우드 web was db 서버 한 서버로 구축하기-2
Ⅰ. 서버 생성 및 접속
Ⅱ. 서버 접속
Ⅲ. JDK 설치
Ⅳ. tomcat 설치
Ⅴ. 파일 배포
Ⅵ. 서버 실행

※ 생성할 서버 스펙  
: mysql(5.7)-centos-7.2-64 서버 사용
: java-1.8.0-openjdk-1.8.0.275.b01-0.el7_9.x86_64   
: tomcat 8   
: 전자정부 프레임워크 - 개발자용 개발환경 32bit/64bit(Implementation Tool) Version 3.9.0   
: web, was, DB가 한 서버에 있음

 

https://devfootprint.tistory.com/59

 

네이버 클라우드 web was db 서버 한 서버로 구축하기-1

네이버 클라우드 web was db 서버 한 서버로 구축하기-1 Ⅰ. 서버 생성 및 접속 Ⅱ. 서버 접속 Ⅲ. JDK 설치 Ⅳ. tomcat 설치 Ⅴ. 파일 배포 Ⅵ. 서버 실행 ※ 생성할 서버 스펙 : mysql..

devfootprint.tistory.com

이전 내용 (네이버 클라우드 web was db 서버 한 서버로 구축하기-1)

 

※ 명령어 입력시 # 이후 텍스트만 붙여넣기.
1. 네이버 클라우드 서버에 JDK 설치 (java 1.8버전)
- 설치 가능한 jdk 버전 확인
명령어 # yum list java*jdk-devel

- 결과 값에 원하는 JDK 1.8이 있음
- jdk 1.8 설치
명령어 # yum install java-1.8.0-openjdk-devel.x86_64
※ 시간이 꽤 걸림

- 설치 결과 확인
명령어 # javac -version
결과 > javac 1.8.0_275

명령어 # rpm -qa java*jdk-devel
결과 > java-1.8.0-openjdk-devel-1.8.0.275.b01-0.el7_9.x86_64

명령어 # which javac
결과 > /usr/bin/javac

명령어 # readlink -f /usr/bin/javac
결과 > /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.275.b01-0.el7_9.x86_64/bin/javac
※ 톰캣 설치 후 JAVA_HOME 환경 변수를 등록해야하기 때문에 알아둬야함

 

2. 네이버 클라우드 서버에 tocmat 설치(tomcat8 버전)
- tomcat8 파일 다운로드
명령어 # wget  archive.apache.org/dist/tomcat/tomcat-8/v8.5.27/bin/apache-tomcat-8.5.27.tar.gz

- 압축 해제
명령어 # tar zxvf  apache-tomcat-8.5.27.tar.gz

- 폴더 명 변경하여 이동
명령어 # mv apache-tomcat-8.5.27 /usr/local/tomcat8



※ vi : 윈도우의 메모장같은 기능이며 CLI (커맨드 라인 인터페이스)가 거부감드는 이유 중 하나
※ 간단한 vi 명령어
- 파일 열기
명령어 # vi 파일명
> 파일을 연 상태가 됨

- 파일을 연 상태에서 편집이 가능한 상태로 변경
명령어 # 키보드에서 i 누르기
> --INSERT-- 가 하단에 표시됨

- 자유롭게 파일 편집

- 파일 편집 중단 상태로 변경
편집 가능한 상태에서 키보드 esc 누르기
> --INSERT-- 가 하단에서 없어짐

- 파일 편집 중단 상태에서 파일 저장
명령어 # w

- vi 빠져 나오기
명령어 # q

- 파일 편집 중단 상태에서 파일 저장 후 vi 빠져나오기
명령어 # wq

- 파일 편집 중단 상태에서 저장하지 않고 vi 빠져 나오기
명령어 # q!

 

3. 네이버 클라우드 서버에 환경변수 등록(jdk와 tomcat)
- 환경 변수 등록
명령어 # vi /etc/profile

- profile 최하단에 추가
① ~가 보일떄까지 키보드에서 page down 누르기
② 키보드에서 i 누르기
③ 아래의 내용 복사하기
④ 마우스 우클릭으로 하기의 내용 붙여넣기
⑤ 키보드에서 ESC 누르기
⑥ 키보드에서 wq 입력하고 엔터

JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.275.b01-0.el7_9.x86_64
CATALINA_HOME=/usr/local/tomcat8
CLASSPATH=$JAVA_HOME/jre/lib:$ tools.jar:$CATALINA_HOME/lib-jsp-api.jar:$CATALINA_HOME/lib/servlet-api.jar
PATH=$PATH:$JAVA_HOME/bin:/bin:/sbin
export JAVA_HOME PATH CLASSPATH CATALINA_HOME

- profile 적용
명령어 # source /etc/profile

 

4. 네이버 클라우드 서버에 tomcat8 인코딩 설정
- 서버 설정 파일 열기
명령어 # vi  /usr/local/tomcat8/conf/server.xml

- 아래의 텍스트를 찾아 URIEncoding="UTF-8" 만 추가
① 아래의 택스트가 보일떄까지 키보드에서 page down 누르기
② 키보드에서 i 누르기
③ 아래의 내용 복사하기
④ 마우스 우클릭으로 하기의 내용 붙여넣기
⑤ 키보드에서 ESC 누르기
⑥ 키보드에서 wq 입력하고 엔터

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443"
           URIEncoding="UTF-8" />

반응형
반응형

네이버 클라우드 web was db 서버 한 서버로 구축하기-1
Ⅰ. 서버 생성 및 접속
Ⅱ. 서버 접속
Ⅲ. JDK 설치
Ⅳ. tomcat 설치
Ⅴ. 파일 배포
Ⅵ. 서버 실행

※ 생성할 서버 스펙 
: mysql(5.7)-centos-7.2-64 서버 사용
: java-1.8.0-openjdk-1.8.0.275.b01-0.el7_9.x86_64  
: tomcat 8  
: 전자정부 프레임워크 - 개발자용 개발환경 32bit/64bit(Implementation Tool) Version 3.9.0  
: web, was, DB가 한 서버에 있음

 

1. 네이버 클라우드 서버 접속 : console.ncloud.com/server/server/create

2. 서버 생성정보 
- 부팅 디스크 크기 : 50 GB
- 이미지 타입 : DBMS
- DBMS 이미지 타입 : MySQL
- 서버타입 : Standard
- 서버 이미지 이름 : mysql(5.7)-centos-7.2-64

(이미지 타입을 Application에 Tomcat으로 설치하면 7.0이 깔리고
MYSQL 설치하니 인코딩이슈에 시간을 너무 쏟게되어 MySql설치된 이미지로 재설치함)

 

3. 이후 설치방법은 naver가 잘알려줌 url : docs.ncloud.com/ko/database/database-1-1.html
인증키 및 네트워크 접근설정 등

 

4. 접속하기
naver에서도 잘 알려주지만 간략히 요약하자면
putty라는 서버 접속 프로그램이 필요하며 
입력 내용은 하기와 같다

- Putty 설치 :  www.chiark.greenend.org.uk/~sgtatham/putty/latest.html
※ 내 로컬 PC는 윈도우 64 bit 이기 때문에 무설치 파일 인 putty.exe를 설치함

- Host Name (or address) : 생성된 네이버 클라우드 서버에 포트포워딩 정보에 나와있는 서버접속용 공인 ip 입력
- Port : 생성된 네이버 클라우드 서버에 포트포워딩 정보에 나와있는 외부포트 입력

- putty 화면
login as : root 입력
password : 네이버 클라우드에서 서버 우클릭 > 관리자 비밀번호 확인 > pem파일 upload 후 나오는 비밀번호 입력

 

반응형
반응형

HTML

<form id="form" method="post">
    <input type="text" id="no" name="no"/>
    <input type="text" id="date" name="date"/>
    <input type="hidden" id="arrayParam" name="arrayParam"/>
    <c:forEach var="item" items="${codeList}">
         <input type="checkbox" name="chk_code" value="${item.code}"> 
         ${item.codename}
    </c:forEach>
</form>
																

 

JQuery

var array = new Array(); // 배열 선언
$('input:checkbox[name=chk_code]:checked').each(function() { // 체크된 체크박스의 value 값을 가지고 온다.
    array.push(this.value);
});
			
$("#arrayParam").val(array);
	
$("#form").attr("action", "/test/test.do");  
$("#form").submit();

 

JAVA (Spring 프레임워크 기반)

@RequestMapping(value = "/test/test.do")
    public String test(@RequestParam HashMap<String, Object> commandMap) throws Exception {
        String[] code_array = null;
		 
        String code = commandMap.get("arrayParam").toString();
        code_array = code.split(",");		
		
        int[] results= new int[code_array.length];
        int result=1;
		
        for(int i=0; i < code_array.length; i++){
            HashMap<String, Object> resendMap = new HashMap<String, Object>();
	        
            resendMap.put("code", code_array[i]);
            resendMap.put("no", commandMap.get("no"));
            resendMap.put("date", commandMap.get("date"));
	        
            results[i] = testDAO.addTestCode(resendMap);
            
            result *= results[i];
        }
        
        return test/result;
    }
반응형
반응형
<c:forEach var="item" items="${list}">
	<input type="checkbox" name="code" value="${item.code}"
		<c:forEach var="myInfo" items="${myInfo}">
			<c:if test="${item.code eq myInfo.code}">
				checked
			</c:if>
		</c:forEach>
	> ${item.codename}
</c:forEach>

 

반응형
반응형

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 파일 생성

반응형

+ Recent posts