浏览代码

2024-06-28 pyeongtaeg security check update

junggilpark 1 年之前
父节点
当前提交
2666d476a2

+ 4 - 3
src/main/java/egovframework/config/CorsFilter.java

@@ -18,21 +18,21 @@ public class CorsFilter implements Filter {
     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
         HttpServletResponse res = (HttpServletResponse) response;
         HttpServletRequest req = (HttpServletRequest) request;
-        res.setHeader("Cache-Control", "no-store, no-cache, must-revalidate, max-age=0, post-check=0, pre-check=0");
+        res.setHeader("Cache-Control", "no-store");
         res.setHeader("Pragma", "no-cache");
+        if (request.getProtocol().equals("HTTP/1.1")) res.setHeader("Cache-Control", "no-cache");
         res.setHeader("Content-Security-Policy",
                 "default-src 'self' 'unsafe-inline' ws: https://dapi.kakao.com http://*.daumcdn.net https://*.daumcdn.net; "+
                 "script-src 'self' 'unsafe-inline' 'unsafe-eval' https://dapi.kakao.com http://*.daumcdn.net https://*.daumcdn.net; " +
                 "style-src 'self' 'unsafe-inline' https://dapi.kakao.com http://*.daumcdn.net https://*.daumcdn.net; "+
                 "img-src 'self' data: https: 'unsafe-inline' https://dapi.kakao.com http://*.daumcdn.net https://*.daumcdn.net;");
-//        res.setHeader("Strict-Transport-Security", "max-age=31536000");
         res.setHeader("X-Content-Type-Options", "nosniff");
         res.setHeader("X-Frame-Options", "SAMEORIGIN");
         res.setHeader("X-Xss-Protection", "1; mode=block");
         res.setHeader("Access-Control-Allow-Methods", "GET, POST");
+        res.setHeader("Strict-Transport-Security", "max-age=31536000; includeSubDomains; preload");
 
         req.setCharacterEncoding("UTF-8");
-
         chain.doFilter(request, response);
     }
 
@@ -40,4 +40,5 @@ public class CorsFilter implements Filter {
     public void destroy() {
         log.info("End Method checking");
     }
+
 }

+ 13 - 0
src/main/java/egovframework/controller/AchiveController.java

@@ -10,6 +10,7 @@ import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
 
 import javax.annotation.PostConstruct;
 import java.util.HashMap;
@@ -53,4 +54,16 @@ public class AchiveController {
         model.addAttribute("notice", result);
         return "archive/listView.tiles";
     }
+
+    @RequestMapping(value = "/getArchiveList.do", method = RequestMethod.POST)
+    @ResponseBody
+    public  Map<String, Object> getArchiveList(String page, String searchText, String searchType) {
+        HashMap <String, String> paramMap = new HashMap<>();
+        paramMap.put("boardId", "2");
+        paramMap.put("page", page);
+        paramMap.put("searchType", searchType);
+        paramMap.put("searchText", searchText);
+        Map<String, Object> resultMap = noticeService.selectBoardList(paramMap, this.criteria);
+        return resultMap;
+    }
 }

+ 12 - 4
src/main/java/egovframework/controller/NoticeController.java

@@ -7,10 +7,7 @@ import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.PostConstruct;
 import javax.servlet.http.HttpServletRequest;
@@ -63,4 +60,15 @@ public class NoticeController {
         this.noticeService.attatchedFileDownload(request, response, paramMap);
     }
 
+    @RequestMapping(value = "/notice/getNoticeList.do", method = RequestMethod.POST)
+    @ResponseBody
+    public  Map<String, Object> getNoticeList(String page, String searchText, String searchType) {
+        HashMap <String, String> paramMap = new HashMap<>();
+        paramMap.put("boardId", "1");
+        paramMap.put("page", page);
+        paramMap.put("searchType", searchType);
+        paramMap.put("searchText", searchText);
+        Map<String, Object> resultMap = noticeService.selectBoardList(paramMap, this.criteria);
+        return resultMap;
+    }
 }

+ 5 - 8
src/main/java/egovframework/interceptors/AdminInterceptor.java

@@ -7,6 +7,7 @@ import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
+import java.net.UnknownHostException;
 
 @Slf4j
 public class AdminInterceptor extends HandlerInterceptorAdapter {
@@ -57,13 +58,10 @@ public class AdminInterceptor extends HandlerInterceptorAdapter {
     }
 
     @Override
-    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) {
-//        String possibleIp = "172.19.100.11";
-        String[] possibleIps = {"172.19.30.15", "172.19.100.11"};
-        for (String possibleIp : possibleIps) {
-            if (getClientIp(request).equals(possibleIp)) {
-                return true;
-            }
+    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws UnknownHostException {
+        String possibleIp = "172.19.";
+        if (getClientIp(request).contains(possibleIp)) {
+            return true;
         }
         try {
             log.error("관리자 페이지 접근 불가 IP 입니다. IP를 확인해주세요. IP : {}", getClientIp(request));
@@ -71,7 +69,6 @@ public class AdminInterceptor extends HandlerInterceptorAdapter {
         } catch (IOException e) {
             log.error("AdminInterceptor: preHandle... 잘못된 페이지 입니다.");
         }
-        //Controller 가 호출되기전에 실행
 
         return false;
     }

+ 1 - 1
src/main/resources/egovframework/sqlmap/jdbc.properties

@@ -10,4 +10,4 @@ dev.db.Password    = ptatms
 prod.db.Driver      = oracle.jdbc.OracleDriver
 prod.db.Url         = jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=172.19.10.25)(PORT=1521))(ADDRESS=(PROTOCOL=TCP)(HOST=172.19.10.26)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ptatms)))
 prod.db.Username    = ptatms
-prod.db.Password    = ptatms
+prod.db.Password    = ptatms

+ 16 - 8
src/main/resources/egovframework/sqlmap/mappers/notice.xml

@@ -22,17 +22,17 @@
 		        FROM (SELECT *
 		                FROM TB_WWW_BOARD
 		        		WHERE BOARDID = #{boardId}
-		                ORDER BY BNOTICE DESC, BOARDNO DESC, REGDATE DESC
+						<if test="searchType == 'title'">
+							AND BSUBJECT LIKE '%'||#{searchText}||'%'
+						</if>
+						<if test="searchType == 'content'">
+							AND BCONTENT LIKE '%'||#{searchText}||'%'
+						</if>
+		        		ORDER BY BNOTICE DESC, BOARDNO DESC, REGDATE DESC
 		            ) A
 		     )
 		WHERE RNUM <![CDATA[>]]> #{pageStart}
-			AND RNUM <![CDATA[<=]]> (#{perPageNum}+#{pageStart})
-		    <if test="searchType == 'title'">
-			AND BSUBJECT LIKE '%'||#{searchText}||'%'
-			</if>
-			<if test="searchType == 'content'">
-			AND BCONTENT LIKE '%'||#{searchText}||'%'
-			</if>
+		  AND RNUM <![CDATA[<=]]> (#{perPageNum}+#{pageStart})
     </select>
     
     <select id="getNoticeTotalCount" parameterType="java.util.HashMap" resultType="int">
@@ -40,6 +40,14 @@
 			NVL(COUNT(*), 0) as boardCount
 		  FROM TB_WWW_BOARD
 		 WHERE BOARDID = #{boardId}
+		<if test="searchType != null and searchType != ''">
+		    <if test="searchType == 'title'">
+				AND BSUBJECT LIKE '%'||#{searchText}||'%'
+		    </if>
+			<if test="searchType == 'content'">
+				AND BCONTENT LIKE '%'||#{searchText}||'%'
+			</if>
+		</if>
 	</select>
 	
 	<select id="getNotice" parameterType="java.util.HashMap" resultType="egovframework.vo.NoticeVO">

+ 120 - 10
src/main/webapp/WEB-INF/jsp/egovframework/admin/archiveList.jsp

@@ -24,19 +24,30 @@
         </div>
         <!--//탭버튼-->
         <div id="noticeCon">
-            <form name="search_form" id="search_form" method="get" action="/ptatms/noticeList.do">
+<%--            <form name="search_form" id="search_form" method="get" action="/ptatms/noticeList.do">--%>
+<%--                <fieldset class="board_search">--%>
+<%--                    <select title="검색항목 선택" name="searchType" >--%>
+<%--                        <option value="title" selected>제목</option>--%>
+<%--                        <option value="content" >내용</option>--%>
+<%--                    </select>--%>
+<%--                    <span class="form_text">--%>
+<%--                        <input type="text" title="검색어 입력" name="searchText" id="searchText"  placeholder="검색어를 입력하세요." />--%>
+<%--						<a href="javascript:$('#search_form').submit();"  class="bt_search"><img src="/common/images/btn-src.png" alt="검색버튼"></a>--%>
+<%--                    </span>--%>
+<%--                </fieldset>--%>
+<%--            </form> --%>
+            <div name="search_form" id="search_form">
                 <fieldset class="board_search">
-                    <select title="검색항목 선택" name="searchType" >
+                    <select title="검색항목 선택" id="searchType" name="searchType" >
                         <option value="title" selected>제목</option>
                         <option value="content" >내용</option>
                     </select>
                     <span class="form_text">
-								<input type="text" title="검색어 입력" name="searchText" id="searchText"  placeholder="검색어를 입력하세요." />
-						<a href="javascript:$('#search_form').submit();"  class="bt_search"><img src="/common/images/btn-src.png" alt="검색버튼"></a>
-							</span>
+                        <input type="text" title="검색어 입력" name="searchText" id="searchText" onkeyup="getSearchList(event)" placeholder="검색어를 입력하세요." />
+						<a href="javascript:getSearchList()" class="bt_search"><img src="/common/images/btn-src.png" alt="검색버튼"></a>
+                    </span>
                 </fieldset>
-            </form>
-
+            </div>
             <div class="board-form">
                 <div class="board-head">
                     <dl>
@@ -74,10 +85,9 @@
                         <p class="prev"><a href="/ptatms/archiveList/${pageMaker.startPage - 1}.do">&lt;</a></p>
                     </c:if>
                     <c:forEach begin="${pageMaker.startPage}" end="${pageMaker.endPage}" var="idx">
-
                         <c:choose>
                             <c:when test="${pageMaker.getCriteria().getPage() eq idx}">
-                                <a <c:out value="${pageMaker.criteria.page == idx ? 'class=active': '' }"></c:out> href="/ptatms/archiveList/${idx}.do" title="선택됨">${idx}</a>
+                                <a class="active" href="/ptatms/archiveList/${idx}.do" title="선택됨">${idx}</a>
                             </c:when>
                             <c:otherwise>
                                 <a href="/ptatms/archiveList/${idx}.do">${idx}</a>
@@ -92,4 +102,104 @@
         </div>
     </article>
 </section>
-<!--//contents-->
+<!--//contents-->
+
+<script>
+    const $boardList = $('.board-list');
+    const $paging    = $('.paging');
+
+    function getSearchList(event, searchText, searchType, page) {
+        if (event && event.key !== 'Enter') {
+            return
+        }
+        const $searchText =  $('#searchText');
+        const $searchType =  $('#searchType');
+
+        if (!searchText) {
+            searchText  = $searchText.val();
+        }
+
+        if (!searchType) {
+            searchType  = $searchType.val();
+        }
+
+        if (!page) {
+            page = 1;
+            const currentPage = $('.paging.active');
+            if (currentPage[0] || currentPage.text()) {
+                page = currentPage.text();
+            }
+        }
+
+        $.ajax({
+            url : '/archive/getArchiveList.do',
+            method : 'POST',
+            data : {
+                page : page,
+                searchType : searchType,
+                searchText : searchText,
+            },
+            success: (res)=>{
+                console.log(res);
+                const {noticeList, pageMaker} = res;
+                $boardList.empty();
+                $paging.empty();
+                if (noticeList && noticeList.length) {
+                    let str = '';
+                    for (let item of noticeList) {
+                        console.log(item);
+                        console.log(item.boardNo);
+                        str +=
+                            `<dl>
+                                <a href="/ptatms/archiveView/\${item.boardNo}.do" title="\${item.bSubject}">`;
+                        if (item.bNotice === 'Y') {
+                             str += `<dd class="board-noti"><span class='blue'>공지</span></dd>`;
+                        }
+                        else {
+                            str += `<dd class="board-noti"><span></span></dd>`;
+                        }
+
+                            str += `<dd class="board-no">\${item.boardNo }</dd>
+                                    <dd class="board-title">\${item.bSubject }</dd>
+                                    <dd class="board-writer">`;
+
+                        if (item.attachFile != '||') {
+                            str += `<img src="/images/icon_file.png" alt="첨부파일" />`;
+                        }
+                            str +=`</dd>
+                                    <dd class="board-day">\${item.regDate}</dd>
+                                    <dd class="board-count">\${item.readCount }</dd>
+                                </a>
+                            </dl>`;
+                    }
+
+                    $boardList.html(str);
+                    if (pageMaker) {
+                        let pageStr = '';
+                        const {startPage, endPage, prev, next, criteria} = pageMaker;
+                        if (prev) {
+                            pageStr += `<p class="prev"><a href="javascript:getSearchList(null, '\${searchText}', '\${searchType}', '\${prev}')">&lt;</a></p>`;
+                        }
+                        for (let ii = startPage; ii <= endPage; ii++) {
+                            if (criteria.page === ii) {
+                                pageStr += `<a class="active" title="선택됨">\${ii}</a>`;
+                            }
+                            else {
+                                pageStr += `<a href="javascript:getSearchList(null, '\${searchText}', '\${searchType}', '\${ii}')">\${ii}</a>`;
+                            }
+                        }
+                        if (next) {
+                            pageStr += ` <p class="next"><a href="javascript:getSearchList(null, '\${searchText}', '\${searchType}', '\${next}')">&gt;</a></p>`;
+                        }
+                        $paging.html(pageStr);
+                    }
+                }
+            },
+            error: (error)=>{
+                alert(error.message);
+            }
+        });
+    }
+
+
+</script>

+ 104 - 7
src/main/webapp/WEB-INF/jsp/egovframework/admin/noticeListNew.jsp

@@ -24,19 +24,19 @@
                 </div>
                 <!--//탭버튼-->
                 <div id="noticeCon">
-                    <form name="search_form" id="search_form" method="get" action="/ptatms/noticeList.do">
+                    <div name="search_form" id="search_form">
                         <fieldset class="board_search">
                             <!-- <legend>공지사항 검색 영역</legend> -->
-                            <select title="검색항목 선택" name="searchType" >
+                            <select title="검색항목 선택" id="searchType" name="searchType" >
                                 <option value="title" selected>제목</option>
                                 <option value="content" >내용</option>
                             </select>
                             <span class="form_text">
-								<input type="text" title="검색어 입력" name="searchText" id="searchText"  placeholder="검색어를 입력하세요." />
-						        <a href="javascript:$('#search_form').submit();"  class="bt_search"><img src="/common/images/btn-src.png" alt="검색버튼"></a>
+								<input type="text" title="검색어 입력" name="searchText" id="searchText" onkeyup="getSearchList(event)" placeholder="검색어를 입력하세요." />
+						        <a href="javascript:getSearchList();"  class="bt_search"><img src="/common/images/btn-src.png" alt="검색버튼"></a>
 							</span>
                         </fieldset>
-                    </form>
+                    </div>
 
                     <div class="board-form">
                         <div class="board-head">
@@ -77,7 +77,7 @@
                             <c:forEach begin="${pageMaker.startPage}" end="${pageMaker.endPage}" var="idx">
                                 <c:choose>
                                     <c:when test="${pageMaker.getCriteria().getPage() eq idx}">
-                                        <a <c:out value="${pageMaker.criteria.page == idx ? 'class=active': '' }"></c:out> href="/ptatms/noticeList/${idx}.do" title="선택됨">${idx}</a>
+                                        <a class="active" href="/ptatms/noticeList/${idx}.do" title="선택됨">${idx}</a>
                                     </c:when>
                                     <c:otherwise>
                                         <a href="/ptatms/noticeList/${idx}.do">${idx}</a>
@@ -92,4 +92,101 @@
                 </div>
             </article>
         </section>
-<!--//contents-->
+<!--//contents-->
+<script>
+    const $boardList = $('.board-list');
+    const $paging    = $('.paging');
+
+    function getSearchList(event, searchText, searchType, page) {
+        if (event && event.key !== 'Enter') {
+            return
+        }
+        const $searchText =  $('#searchText');
+        const $searchType =  $('#searchType');
+
+        if (!searchText) {
+            searchText  = $searchText.val();
+        }
+
+        if (!searchType) {
+            searchType  = $searchType.val();
+        }
+
+        if (!page) {
+            page = 1;
+            const currentPage = $('.paging.active');
+            if (currentPage[0] || currentPage.text()) {
+                page = currentPage.text();
+            }
+        }
+
+        $.ajax({
+            url : '/notice/getNoticeList.do',
+            method : 'POST',
+            data : {
+                page : page,
+                searchType : searchType,
+                searchText : searchText,
+            },
+            success: (res)=>{
+                console.log(res);
+                const {noticeList, pageMaker} = res;
+                $boardList.empty();
+                $paging.empty();
+                if (noticeList && noticeList.length) {
+                    let str = '';
+                    for (let item of noticeList) {
+                        console.log(item);
+                        console.log(item.boardNo);
+                        str +=
+                            `<dl>
+                                <a href="/ptatms/noticeView/\${item.boardNo}.do" title="\${item.bSubject}">`;
+                        if (item.bNotice === 'Y') {
+                            str += `<dd class="board-noti"><span class='blue'>공지</span></dd>`;
+                        }
+                        else {
+                            str += `<dd class="board-noti"><span></span></dd>`;
+                        }
+
+                        str += `<dd class="board-no">\${item.boardNo }</dd>
+                                    <dd class="board-title">\${item.bSubject }</dd>
+                                    <dd class="board-writer">`;
+
+                        if (item.attachFile != '||') {
+                            str += `<img src="/images/icon_file.png" alt="첨부파일" />`;
+                        }
+                        str +=`</dd>
+                                    <dd class="board-day">\${item.regDate}</dd>
+                                    <dd class="board-count">\${item.readCount }</dd>
+                                </a>
+                            </dl>`;
+                    }
+
+                    $boardList.html(str);
+                    if (pageMaker) {
+                        let pageStr = '';
+                        const {startPage, endPage, prev, next, criteria} = pageMaker;
+                        if (prev) {
+                            pageStr += `<p class="prev"><a href="javascript:getSearchList(null, '\${searchText}', '\${searchType}', '\${prev}')">&lt;</a></p>`;
+                        }
+                        for (let ii = startPage; ii <= endPage; ii++) {
+                            if (criteria.page === ii) {
+                                pageStr += `<a class="active" title="선택됨">\${ii}</a>`;
+                            }
+                            else {
+                                pageStr += `<a href="javascript:getSearchList(null, '\${searchText}', '\${searchType}', '\${ii}')">\${ii}</a>`;
+                            }
+                        }
+                        if (next) {
+                            pageStr += ` <p class="next"><a href="javascript:getSearchList(null, '\${searchText}', '\${searchType}', '\${next}')">&gt;</a></p>`;
+                        }
+                        $paging.html(pageStr);
+                    }
+                }
+            },
+            error: (error)=>{
+                alert(error.message);
+            }
+        });
+    }
+</script>

+ 101 - 8
src/main/webapp/WEB-INF/jsp/egovframework/archive/list.jsp

@@ -14,19 +14,19 @@
             <p class="title-info">시민 중심 새로운 <span>평택 교통정보센터</span></p>
         </div>
         <div id="noticeCon">
-            <form name="search_form" id="search_form" method="get" action="/archive/archiveList.do">
+            <div name="search_form" id="search_form" method="get" action="/archive/archiveList.do">
                 <fieldset class="board_search">
                     <!-- <legend>공지사항 검색 영역</legend> -->
-                    <select title="검색항목 선택" name="searchType" >
+                    <select title="검색항목 선택" id="searchType" name="searchType" >
                         <option value="title" selected>제목</option>
                         <option value="content" >내용</option>
                     </select>
                     <span class="form_text">
-								<input type="text" title="검색어 입력" name="searchText" id="searchText"  placeholder="검색어를 입력하세요." />
-						<a href="javascript:$('#search_form').submit();"  class="bt_search"><img src="/common/images/btn-src.png" alt="검색버튼"></a>
-							</span>
+                        <input type="text" title="검색어 입력" name="searchText" id="searchText" onkeyup="getSearchList(event)"  placeholder="검색어를 입력하세요." />
+						<a href="javascript:getSearchList()"  class="bt_search"><img src="/common/images/btn-src.png" alt="검색버튼"></a>
+                    </span>
                 </fieldset>
-            </form>
+            </div>
 
             <div class="board-form">
                 <div class="board-head">
@@ -63,7 +63,7 @@
                     <c:forEach begin="${pageMaker.startPage}" end="${pageMaker.endPage}" var="idx">
                         <c:choose>
                             <c:when test="${pageMaker.getCriteria().getPage() eq idx}">
-                                <a <c:out value="${pageMaker.criteria.page == idx ? 'class=active': '' }"></c:out> href="/archive/archiveList/${idx}.do" title="선택됨">${idx}</a>
+                                <a class="active" href="/archive/archiveList/${idx}.do" title="선택됨">${idx}</a>
                             </c:when>
                             <c:otherwise>
                                 <a href="/archive/archiveList/${idx}.do">${idx}</a>
@@ -80,4 +80,97 @@
         </div>
     </article>
 </section>
-<!--//contents-->
+<!--//contents-->
+<script>
+    const $boardList = $('.board-list');
+    const $paging    = $('.paging');
+
+    function getSearchList(event, searchText, searchType, page) {
+        if (event && event.key !== 'Enter') {
+            return
+        }
+        const $searchText = $('#searchText');
+        const $searchType = $('#searchType');
+
+        if (!searchText) {
+            searchText = $searchText.val();
+        }
+
+        if (!searchType) {
+            searchType = $searchType.val();
+        }
+
+        if (!page) {
+            page = 1;
+            const currentPage = $('.active');
+            if (currentPage[0] || currentPage.text()) {
+                page = currentPage.text();
+            }
+        }
+
+        $.ajax({
+            url: '/archive/getArchiveList.do',
+            method: 'POST',
+            data: {
+                page: page,
+                searchType: searchType,
+                searchText: searchText,
+            },
+            success: (res) => {
+                console.log(res);
+                const {noticeList, pageMaker} = res;
+                $boardList.empty();
+                $paging.empty();
+                if (noticeList && noticeList.length) {
+                    let str = '';
+                    for (let item of noticeList) {
+                        str +=
+                            `<dl>
+                                <a href="/archive/listView/\${item.boardNo}.do" title="\${item.bSubject}">`;
+                        if (item.bNotice === 'Y') {
+                            str += `<dd class="board-noti"><span class='blue'>공지</span></dd>`;
+                        } else {
+                            str += `<dd class="board-noti"><span></span></dd>`;
+                        }
+
+                        str += `<dd class="board-no">\${item.boardNo }</dd>
+                                    <dd class="board-title">\${item.bSubject }</dd>
+                                    <dd class="board-writer">`;
+
+                        if (item.attachFile != '||') {
+                            str += `<img src="/images/icon_file.png" alt="첨부파일" />`;
+                        }
+                        str += `</dd>
+                                    <dd class="board-day">\${item.regDate}</dd>
+                                    <dd class="board-count">\${item.readCount }</dd>
+                                </a>
+                            </dl>`;
+                    }
+
+                    $boardList.html(str);
+                    if (pageMaker) {
+                        let pageStr = '';
+                        const {startPage, endPage, prev, next, criteria} = pageMaker;
+                        if (prev) {
+                            pageStr += `<p class="prev"><a href="javascript:getSearchList(null, '\${searchText}', '\${searchType}', '\${prev}')">&lt;</a></p>`;
+                        }
+                        for (let ii = startPage; ii <= endPage; ii++) {
+                            if (criteria.page === ii) {
+                                pageStr += `<a class="active" title="선택됨">\${ii}</a>`;
+                            } else {
+                                pageStr += `<a href="javascript:getSearchList(null, '\${searchText}', '\${searchType}', '\${ii}')">\${ii}</a>`;
+                            }
+                        }
+                        if (next) {
+                            pageStr += ` <p class="next"><a href="javascript:getSearchList(null, '\${searchText}', '\${searchType}', '\${next}')">&gt;</a></p>`;
+                        }
+                        $paging.html(pageStr);
+                    }
+                }
+            },
+            error: (error) => {
+                alert(error.message);
+            }
+        });
+    }
+</script>

+ 0 - 8
src/main/webapp/WEB-INF/jsp/egovframework/intro/locationNew.jsp

@@ -15,18 +15,10 @@
 		<div class="location-info">
 			<h3 class="h3-title">위치안내</h3>
 			<div class="location-map">
-				<!-- * 카카오맵 - 지도퍼가기 -->
-				<!-- 1. 지도 노드 -->
                 <div id="daumRoughmapContainer1668672408062" class="root_daum_roughmap root_daum_roughmap_landing" style="width: 100%;"></div>
 
-				<!--
-                    2. 설치 스크립트
-                    * 지도 퍼가기 서비스를 2개 이상 넣을 경우, 설치 스크립트는 하나만 삽입합니다.
-                -->
-
 				<script charset="UTF-8" class="daum_roughmap_loader_script" src="https://ssl.daumcdn.net/dmaps/map_js_init/roughmapLoader.js"></script>
 
-				<!-- 3. 실행 스크립트 -->
 				<script charset="UTF-8">
 					new daum.roughmap.Lander({
 						"timestamp" : "1668672408062",

+ 1 - 1
src/main/webapp/WEB-INF/jsp/egovframework/main/popup.jsp

@@ -122,7 +122,7 @@
 	    todayDate.setMinutes('00');
 	    todayDate.setSeconds('00');
 		//todayDate = new Date(parseInt(todayDate.getTime() / 86400000) * 86400000 + 54000000);
-		document.cookie = name + "=" + escape( value ) + "; path=/; expires=" + todayDate.toGMTString() + ";";
+		document.cookie = name + "=" + escape( value ) + "; path=/; expires=" + todayDate.toGMTString() + "; SameSite=Strict; secure;";
 	}
 </script>
 </html>

+ 105 - 8
src/main/webapp/WEB-INF/jsp/egovframework/notice/noticeListNew.jsp

@@ -14,21 +14,21 @@
             <p class="title-info">시민 중심 새로운 <span>평택 교통정보센터</span></p>
         </div>
         <div id="noticeCon">
-            <form name="search_form" id="search_form" method="get" action="/notice/noticeList.do">
+            <div name="search_form" id="search_form">
                 <fieldset class="board_search">
                     <!-- <legend>공지사항 검색 영역</legend> -->
-                    <select title="검색항목 선택" name="searchType">
+                    <select title="검색항목 선택" id="searchType" name="searchType">
                         <option value="title" selected>제목</option>
                         <option value="content">내용</option>
                     </select>
                     <span class="form_text">
-								<input type="text" title="검색어 입력" name="searchText" id="searchText"
+								<input type="text" title="검색어 입력" name="searchText" onkeyup="getSearchList(event)" id="searchText"
                                        placeholder="검색어를 입력하세요."/>
-						<a href="javascript:$('#search_form').submit();" class="bt_search"><img
+						<a href="javascript:getSearchList();" class="bt_search"><img
                                 src="/common/images/btn-src.png" alt="검색버튼"></a>
 							</span>
                 </fieldset>
-            </form>
+            </div>
 
             <div class="board-form">
                 <div class="board-head">
@@ -70,8 +70,7 @@
                     <c:forEach begin="${pageMaker.startPage}" end="${pageMaker.endPage}" var="idx">
                         <c:choose>
                             <c:when test="${pageMaker.getCriteria().getPage() eq idx}">
-                                <a <c:out value="${pageMaker.criteria.page == idx ? 'class=active': '' }"></c:out>
-                                        href="/notice/noticeList/${idx}.do" title="선택됨">${idx}</a>
+                                <a class="active" href="/notice/noticeList/${idx}.do" title="선택됨">${idx}</a>
                             </c:when>
                             <c:otherwise>
                                 <a href="/notice/noticeList/${idx}.do">${idx}</a>
@@ -88,4 +87,102 @@
         </div>
     </article>
 </section>
-<!--//contents-->
+<!--//contents-->
+
+<script>
+    const $boardList = $('.board-list');
+    const $paging    = $('.paging');
+
+    function getSearchList(event, searchText, searchType, page) {
+        if (event && event.key !== 'Enter') {
+            return
+        }
+        const $searchText =  $('#searchText');
+        const $searchType =  $('#searchType');
+
+        if (!searchText) {
+            searchText  = $searchText.val();
+        }
+
+        if (!searchType) {
+            searchType  = $searchType.val();
+        }
+
+        if (!page) {
+            page = 1;
+            const currentPage = $('.paging.active');
+            if (currentPage[0] || currentPage.text()) {
+                page = currentPage.text();
+            }
+        }
+
+        $.ajax({
+            url : '/notice/getNoticeList.do',
+            method : 'POST',
+            data : {
+                page : page,
+                searchType : searchType,
+                searchText : searchText,
+            },
+            success: (res)=>{
+                console.log(res);
+                const {noticeList, pageMaker} = res;
+                $boardList.empty();
+                $paging.empty();
+                if (noticeList && noticeList.length) {
+                    let str = '';
+                    for (let item of noticeList) {
+                        console.log(item);
+                        console.log(item.boardNo);
+                        str +=
+                            `<dl>
+                                <a href="/notice/noticeView/\${item.boardNo}.do" title="\${item.bSubject}">`;
+                        if (item.bNotice === 'Y') {
+                            str += `<dd class="board-noti"><span class='blue'>공지</span></dd>`;
+                        }
+                        else {
+                            str += `<dd class="board-noti"><span></span></dd>`;
+                        }
+
+                        str += `<dd class="board-no">\${item.boardNo }</dd>
+                                    <dd class="board-title">\${item.bSubject }</dd>
+                                    <dd class="board-writer">`;
+
+                        if (item.attachFile != '||') {
+                            str += `<img src="/images/icon_file.png" alt="첨부파일" />`;
+                        }
+                        str +=`</dd>
+                                    <dd class="board-day">\${item.regDate}</dd>
+                                    <dd class="board-count">\${item.readCount }</dd>
+                                </a>
+                            </dl>`;
+                    }
+
+                    $boardList.html(str);
+                    if (pageMaker) {
+                        let pageStr = '';
+                        const {startPage, endPage, prev, next, criteria} = pageMaker;
+                        if (prev) {
+                            pageStr += `<p class="prev"><a href="javascript:getSearchList(null, '\${searchText}', '\${searchType}', '\${prev}')">&lt;</a></p>`;
+                        }
+                        for (let ii = startPage; ii <= endPage; ii++) {
+                            if (criteria.page === ii) {
+                                pageStr += `<a class="active" title="선택됨">\${ii}</a>`;
+                            }
+                            else {
+                                pageStr += `<a href="javascript:getSearchList(null, '\${searchText}', '\${searchType}', '\${ii}')">\${ii}</a>`;
+                            }
+                        }
+                        if (next) {
+                            pageStr += ` <p class="next"><a href="javascript:getSearchList(null, '\${searchText}', '\${searchType}', '\${next}')">&gt;</a></p>`;
+                        }
+                        $paging.html(pageStr);
+                    }
+                }
+            },
+            error: (error)=>{
+                alert(error.message);
+            }
+        });
+    }
+</script>

+ 4 - 0
src/main/webapp/WEB-INF/jsp/egovframework/tiles/templateNew.jsp

@@ -11,7 +11,11 @@
     <meta http-equiv="Content-Script-Type" content="text/javascript">
     <meta http-equiv="Content-Style-Type" content="text/css">
     <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta name="referrer" content="strict-origin-when-cross-origin">
     <meta name="format-detection" content="telephone=no">
+<%--    <meta http-equiv="Expires" content="-1">--%>
+<%--    <meta http-equiv="Pragma" content="no-cache">--%>
+<%--    <meta http-equiv="Cache-Control" content="No-Cache">--%>
     <link rel="favicon" href="/images/favicon.ico">
     <title>평택시 교통정보센터 - ${subTitle}</title>
 

+ 1 - 1
src/main/webapp/js/common.js

@@ -2066,7 +2066,7 @@ function getVisitCount(){
 function setCookie(name, value, expiredays) {
     var todayDate = new Date();
     todayDate.setDate(todayDate.getDate() + expiredays);
-    document.cookie = name + "=" + escape(value) + "; path=/; expires=" +
+    document.cookie = name + "=" + escape(value) + "; path=/; SameSite=Strict; expires=" +
         todayDate.toGMTString() + " Secure;"
 }
 

+ 0 - 33
src/main/webapp/test.html

@@ -1,33 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-    <meta charset="UTF-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge">
-    <meta name="viewport" content="width=device-width, initial-scale=1.0">
-    <title>Document</title>
-</head>
-<body>
-    <style>
-    
-    /* 웹폰트 */
-       @import url('https://fonts.googleapis.com/css2?family=Nanum+Brush+Script&family=Song+Myung&display=swap');
-             .webFontTest{
-             font-family: 'Nanum Brush Script';
-             }
-    
-    /* 내부폰트 */
-    @font-face {
-          font-family: '궁서'; /*폰트명지정*/
-          src: url('/libs/font_korean/궁서체.ttf'); /*파일경로*/
-          }
-    .fontFileTest {
-    font-family: '궁서';
-    }
-    
-    </style>
-    
-    <div class="fontFileTest"> 동해물과 백두산이 마르고 닳도록 하나님이 보우하사 우리나라 만세</div>
-    <div class="webFontTest"> 동해물과 백두산이 마르고 닳도록 하나님이 보우하사 우리나라 만세</div>
-    
-    </body>
-</html>