Browse Source

로그인 구현 / session controller 추가

huiwon.seo 4 năm trước cách đây
mục cha
commit
ea4c9b367d

+ 14 - 7
src/main/java/com/lemon/lifecenter/common/LifeCenterFunction.java

@@ -173,18 +173,21 @@ public class LifeCenterFunction {
     }
 
     public static String getRemoteAddr(HttpServletRequest request) {
-        String ip = request.getHeader("X-FORWARDED-FOR");
+        String ip = request.getHeader("X-Forwarded-For");
 
-        if (ip == null || ip.length() == 0) {
+        if (ip == null) {
             ip = request.getHeader("Proxy-Client-IP");
         }
-
-        // 웹로직 서버일 경우
-        if (ip == null || ip.length() == 0) {
+        if (ip == null) {
             ip = request.getHeader("WL-Proxy-Client-IP");
         }
-
-        if (ip == null || ip.length() == 0) {
+        if (ip == null) {
+            ip = request.getHeader("HTTP_CLIENT_IP");
+        }
+        if (ip == null) {
+            ip = request.getHeader("HTTP_X_FORWARDED_FOR");
+        }
+        if (ip == null) {
             ip = request.getRemoteAddr();
         }
 
@@ -232,4 +235,8 @@ public class LifeCenterFunction {
 
         return sb.toString();
     }
+    
+    public static String removeTag(String html) throws Exception {
+        return html.replaceAll("<(/)?([a-zA-Z]*)(\\s[a-zA-Z]*=[^>]*)?(\\s)*(/)?>", "");
+    }
 }

+ 21 - 0
src/main/java/com/lemon/lifecenter/common/LifeCenterSessionController.java

@@ -0,0 +1,21 @@
+package com.lemon.lifecenter.common;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+public class LifeCenterSessionController {
+  public static void setSession( HttpServletRequest request, String key, String value ) {
+    HttpSession session = request.getSession( true );
+    session.setAttribute( key, value );
+  }
+  
+  public static String getSession( HttpServletRequest request, String key ) {
+    HttpSession session = request.getSession( false );
+    String data = session.getAttribute( key ) == null ? "" : session.getAttribute( key ).toString();
+    
+    return data;
+  }
+  
+  public static void sessionInvalidate( HttpServletRequest request ) {
+    request.getSession().invalidate();
+  }
+}

+ 87 - 16
src/main/java/com/lemon/lifecenter/controller/LoginController.java

@@ -1,6 +1,13 @@
 package com.lemon.lifecenter.controller;
 
+import java.util.HashMap;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
 import org.json.JSONObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.ModelAttribute;
@@ -12,12 +19,15 @@ import org.springframework.web.servlet.ModelAndView;
 import com.lemon.lifecenter.common.LifeCenterConfigVO;
 import com.lemon.lifecenter.common.LifeCenterController;
 import com.lemon.lifecenter.common.LifeCenterFunction;
+import com.lemon.lifecenter.common.LifeCenterSessionController;
 import com.lemon.lifecenter.dto.LoginDTO;
 import com.lemon.lifecenter.service.LoginService;
 
 @Controller
 @RequestMapping("/login")
 public class LoginController extends LifeCenterController {
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+    
     @Autowired
     LifeCenterConfigVO config;
     
@@ -41,39 +51,100 @@ public class LoginController extends LifeCenterController {
     
     @RequestMapping( value="/check", method = RequestMethod.POST )
     @ResponseBody
-    public String staffLoginCheck( @ModelAttribute("dto") final LoginDTO dto ) throws Exception {
+    public String staffLoginCheck( 
+            @ModelAttribute("dto") final LoginDTO dto, 
+            HttpServletRequest request, HttpServletResponse response ) throws Exception {
+        String remoteIp   = LifeCenterFunction.getRemoteAddr( request );
         String resultCode = "";
-        System.out.println( "ID : " + dto.getId() );
-        System.out.println( "PASSWROD : " + dto.getPassword() );
-        
-        String encPass = LifeCenterFunction.aesEncrypt( config.aesKey, config.IV, dto.getPassword() );
-        System.out.println( "encPass: " + encPass );
-        dto.setPassword( encPass );
-        System.out.println( "dto.getPassword() : "  +  dto.getPassword() );
-        int total = loginService.selectMemberCount( dto );
+        String message    = "";
         
+        HashMap<String, String> accessMap = new HashMap<String, String>();
         JSONObject json = new JSONObject();
         
-        if( total == 0 ) {
-            // 로그인 failCount ++
+        dto.setPassword( LifeCenterFunction.aesEncrypt( config.aesKey, config.IV, dto.getPassword() ) );
+        
+        int total = loginService.selectMemberCount( dto );
+        
+        if( total == 0 ) { //로그인실패시 log 남긴 후 failCount 처리
+            
             resultCode = "01";
-        } else {
+            message    = "아이디 또는 비밀번호를 다시 확인하세요.<br/>등록되지 않은 사용자이거나, 잘못된 비밀번호입니다.";
+            
+            logger.error( "[LOGIN FAILED] RemoteIP : " + remoteIp + " ID : " + dto.getId() + "MESSAGE : " + LifeCenterFunction.removeTag( message ) );
+            
+            if( loginService.selectMemberIdCount( dto ) == 1 ) { //존재하는사용자일경우
+                dto.setFailCount( loginService.selectMemberFailCount( dto ) + 1 ); //해당아이디의 failCount + 1
+                dto.setResultCode( resultCode );
+                
+                accessMap.put( "id" , dto.getId() );
+                accessMap.put( "ip" , remoteIp );
+                accessMap.put( "successYn", "N" );
+                accessMap.put( "logMessage" , LifeCenterFunction.removeTag( message ) );
+                
+                loginService.updateMemberLoginData( dto ); //해당 아이디의 failCount
+                loginService.insertAccessHistory( accessMap );
+            }
+        } else { // 로그인 성공시 ( id, password 일치 )
             LoginDTO memberData = loginService.selectMemberData( dto );
             
-            if( memberData.getUseYn().toUpperCase().equals( "N" ) ) {
-                // 사용이 중지된 계정
+            accessMap.put( "id" , dto.getId() );
+            accessMap.put( "ip" , remoteIp );
+            
+            if( memberData.getUseYn().toUpperCase().equals( "N" ) ) { // 사용이 중지된 계정
+                logger.error( "[LOGIN FAILED] RemoteIP : " + remoteIp + " ID : " + dto.getId() );
+                
                 resultCode = "02";
+                message    = "사용이 중지된 계정입니다. 관리자에게 문의하세요.";
+                
+                accessMap.put( "successYn", "N" );
+                accessMap.put( "logMessage" , message );
+                
+                logger.error( "[LOGIN FAILED] RemoteIP : " + remoteIp + " ID : " + dto.getId() + "MESSAGE : " + message );
+                
+                loginService.insertAccessHistory( accessMap );
                 
             } else {
                 // 로그인 성공
-                resultCode = "success";
+                // failCount 0 초기화
+                // last login time NOW() update
+                resultCode = "00";
+                message    = "로그인 성공";
+                
+                dto.setFailCount( 0 );
+                accessMap.put( "successYn", "Y" );
+                accessMap.put( "logMessage" , message );
+                
+                logger.info( "[LOGIN SUCCESS] RemoteIP : " + remoteIp + " ID : " + dto.getId() + "MESSAGE : " + message );
+                
+                loginService.updateMemberLoginData( dto );
+                loginService.insertAccessHistory( accessMap );
+                
+                LifeCenterSessionController.sessionInvalidate( request );
+                
+                LifeCenterSessionController.setSession( request, "sesId",   dto.getId().toLowerCase() );
+                LifeCenterSessionController.setSession( request, "sesName", dto.getName() );
+                LifeCenterSessionController.setSession( request, "sesCenterCode", dto.getCenterCode() );
+                LifeCenterSessionController.setSession( request, "sesGroupIdx", String.valueOf( dto.getGroupIdx() ) );
             }
         }
-            
+        
         json.put( "code", resultCode );
+        json.put( "message", message );
         
         System.out.println( "JSON : " + json );
         
         return json.toString();
     }
+    
+    @RequestMapping("/logout")
+    public String staffLogout( HttpServletRequest request, HttpServletResponse response ) {
+        String remoteIp  = LifeCenterFunction.getRemoteAddr( request );
+        String sesId     = LifeCenterSessionController.getSession( request, "sesId" );
+        
+        LifeCenterSessionController.sessionInvalidate( request );
+        
+        logger.error( "[LOGOUT] RemoteIP : " + remoteIp + " UserId : " + sesId );
+        
+        return "redirect:/login/staff";
+    }
 }

+ 10 - 1
src/main/java/com/lemon/lifecenter/dto/LoginDTO.java

@@ -16,8 +16,17 @@ public class LoginDTO {
     public int groupIdx;
     public String centerCode;
     public String updateById;
-
+    public String resultCode;
+    
     
+    public String getResultCode() {
+        return resultCode;
+    }
+
+    public void setResultCode(String resultCode) {
+        this.resultCode = resultCode;
+    }
+
     public String getCreateDate() {
         return createDate;
     }

+ 6 - 0
src/main/java/com/lemon/lifecenter/mapper/LoginMapper.java

@@ -1,5 +1,7 @@
 package com.lemon.lifecenter.mapper;
 
+import java.util.HashMap;
+
 import org.apache.ibatis.annotations.Mapper;
 import org.springframework.stereotype.Repository;
 
@@ -10,4 +12,8 @@ import com.lemon.lifecenter.dto.LoginDTO;
 public interface LoginMapper {
     public int selectMemberCount(LoginDTO dto);
     public LoginDTO selectMemberData(LoginDTO dto);
+    public Integer updateMemberLoginData(LoginDTO dto);
+    public int selectMemberIdCount(LoginDTO dto);
+    public int selectMemberFailCount(LoginDTO dto);
+    public void insertAccessHistory(HashMap<String, String> hashMap);
 }

+ 17 - 0
src/main/java/com/lemon/lifecenter/service/LoginService.java

@@ -1,5 +1,7 @@
 package com.lemon.lifecenter.service;
 
+import java.util.HashMap;
+
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -18,4 +20,19 @@ public class LoginService {
     public LoginDTO selectMemberData(LoginDTO dto) {
         return mapper.selectMemberData(dto);
     }
+    
+    public Integer updateMemberLoginData(LoginDTO dto) {
+        return mapper.updateMemberLoginData(dto);
+    }
+    
+    public int selectMemberIdCount(LoginDTO dto) {
+        return mapper.selectMemberIdCount(dto);
+    }
+    public int selectMemberFailCount(LoginDTO dto) {
+        return mapper.selectMemberFailCount(dto);
+    }
+    
+    public void insertAccessHistory(HashMap<String, String> hashMap) {
+        mapper.insertAccessHistory(hashMap); 
+    }
 }

+ 41 - 0
src/main/resources/mybatis/mapper/login/login.xml

@@ -2,6 +2,15 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 
 <mapper namespace="com.lemon.lifecenter.mapper.LoginMapper">
+    <select id="selectMemberIdCount" parameterType="LoginDTO" resultType="int">
+        <![CDATA[
+            SELECT COUNT(*) total
+              FROM member
+             WHERE id = #{id}
+        ]]>
+    </select>
+    
+    
     <select id="selectMemberCount" parameterType="LoginDTO" resultType="int">
         <![CDATA[
             SELECT COUNT(*) total
@@ -28,4 +37,36 @@
                AND password = #{password}
         ]]>
     </select>
+    
+    <select id="selectMemberFailCount" parameterType="LoginDTO" resultType="int">
+        <![CDATA[
+            SELECT fail_count AS failCount
+              FROM member
+             WHERE id = #{id}
+        ]]>
+    </select>
+    
+    <update id="updateMemberLoginData" parameterType="LoginDTO">
+        <![CDATA[
+            UPDATE MEMBER
+               SET FAIL_COUNT = #{failCount}
+        ]]>
+        <if test="resultCode != null and resultCode.equals( '00' )">
+            <![CDATA[
+                   LAST_LOGIN_TIME = NOW()
+            ]]>
+        </if>
+        <![CDATA[
+             WHERE ID = #{id}
+        ]]>
+    </update>
+    
+    
+    <insert id="insertAccessHistory" parameterType="HashMap">
+        <![CDATA[
+            INSERT INTO ACCESS_HISTORY
+                        (ID,    IP,    LOGIN_TIME, SUCCESS_YN,   lOG_MESSAGE)
+                  VALUE (#{id}, #{ip}, NOW(),      #{successYn}, #{logMessage})
+        ]]>
+    </insert>
 </mapper>

+ 26 - 0
src/main/webapp/WEB-INF/jsp/include/top.jsp

@@ -0,0 +1,26 @@
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
+<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
+
+<nav class="navbar navbar-expand navbar-light bg-white">
+    <a class="sidebar-toggle d-flex mr-2"> <i
+        class="hamburger align-self-center"></i>
+    </a>
+
+    <div class="navbar-collapse collapse">
+        <ul class="navbar-nav ml-auto">
+            <li class="nav-item dropdown">
+                <a class="nav-icon dropdown-toggle d-inline-block d-sm-none" href="#" data-toggle="dropdown">
+                    <i class="align-middle" data-feather="settings"></i>
+                </a>
+
+                <a class="nav-link dropdown-toggle d-none d-sm-inline-block" href="#" data-toggle="dropdown">
+                    <span class="text-dark">홍길동 선생님</span>
+                </a>
+                <div class="dropdown-menu dropdown-menu-right">
+                    <a class="dropdown-item" href="pages-profile.html"><i class="align-middle mr-1" data-feather="user"></i> 정보변경</a>
+                    <a class="dropdown-item" href="#"><i class="align-middle mr-1" data-feather="pie-chart"></i> 로그아웃</a>
+                </div>
+            </li>
+        </ul>
+    </div>
+</nav>

+ 51 - 24
src/main/webapp/WEB-INF/jsp/login/staff.jsp

@@ -27,28 +27,52 @@
         });
     });
 </script>
-<script>
+<script type="text/javascript">
 $( function(){
-});
-
-function loginFormCheck(){
-    $.ajax({
-        url      : "./check",
-        data     : $("#loginForm").serialize(),
-        method   : "POST",
-        dataType : "json",
-        success  : function( data ){
-            console.log( data );
+    $( "#loginForm" ).validate({
+        onfocusout: function (element) {
+            $( element ).valid();
+            $( "#msg" ).remove();
+        },
+        messages : {
+            id : {
+                required : "아이디를 입력해주세요."
+            },
+            password : {
+                required : "비밀번호를 입력해주세요."
+            }
         },
-        error : function(){
+        submitHandler: function(form) {
+            $( "#submitLoading" ).toggleClass( "d-none", false );
+            $( "#submitBtn" ).toggleClass( "d-none", true );
             
+            $.ajax({
+                url      : "./check",
+                data     : $("#loginForm").serialize(),
+                method   : "POST",
+                dataType : "json",
+                success  : function( data ){
+                    var resultCode = data.code;
+                    var resultMsg  = data.message;
+                    
+                    if( data.code == "00" ) {
+                        location.href="/patient/list";
+                    } else {
+                        $( "#password" ).after( "<label id='msg' class='error'>" + resultMsg + "</label>" );
+                        $( "#submitLoading" ).toggleClass( "d-none", true );
+                        $( "#submitBtn" ).toggleClass( "d-none", false );
+                    };
+                },
+                error : function(){
+                    $( "#submitLoading" ).toggleClass( "d-none", true );
+                    $( "#submitBtn" ).toggleClass( "d-none", false );
+                }
+            }).done( function(){
+                
+            });
         }
-      }).done( function(){
-
     });
-
-    return false;
-}
+});
 </script>
 </head>
 <body>
@@ -69,23 +93,26 @@ function loginFormCheck(){
                         <div class="card">
                             <div class="card-body">
                                 <div class="m-sm-4">
-                                    <form id="loginForm" action="./check" method="post" onsubmit="return loginFormCheck();">
+                                    <form id="loginForm" action="./check" method="post">
                                         <div class="form-group">
                                             <label>아이디</label>
-                                            <input id="id" class="form-control form-control-lg" type="text" name="id" title="아이디" placeholder="아이디를 입력해주세요" tabindex="1" maxlength="20" required>
+                                            <input id="id" class="form-control form-control-lg" type="text" name="id" placeholder="아이디" tabindex="1" maxlength="20" required>
                                         </div>
                                         <div class="form-group">
                                             <label>비밀번호</label>
-                                            <input id="password" class="form-control form-control-lg" type="password" name="password" title="비밀번호" placeholder="비밀번호를 입력해주세요" autocomplete="off" tabindex="2" maxlength="20" required>
+                                            <input id="password" class="form-control form-control-lg" type="password" name="password" placeholder="비밀번호" autocomplete="off" tabindex="2" maxlength="20" required>
                                         </div>
                                         <div>
-                                            <div class="custom-control custom-checkbox align-items-center">
-                                                <input type="checkbox" class="custom-control-input" value="remember-me" name="remember-me" checked="checked">
-                                                <label class="custom-control-label text-small">아이디 저장</label>
+                                            <div class="custom-control custom-checkbox align-items-center text-right">
+                                                <input type="checkbox" id="saveId" class="custom-control-input" value="remember-me" name="remember-me" checked="checked">
+                                                <label for="saveId" class="custom-control-label text-small">아이디 저장</label>
                                             </div>
                                         </div>
                                         <div class="text-center mt-3">
-                                            <button type="submit" class="btn btn-lg btn-primary">로그인</button>
+                                            <button id="submitBtn" type="submit" class="btn btn-lg btn-primary">로그인</button>
+                                            <div id="submitLoading" class="d-none align-bottom spinner-border text-primary" role="status">
+                                              <span class="sr-only">Loading...</span>
+                                            </div>
 <!--                                             <a href="../patient/list" class="btn btn-lg btn-primary">로그인</a> -->
                                         </div>
                                     </form>

+ 1 - 30
src/main/webapp/WEB-INF/jsp/patient/edit.jsp

@@ -99,36 +99,7 @@
         <jsp:include page="${data._INCLUDE}/sidebar.jsp"></jsp:include>
 
         <div class="main">
-            <nav class="navbar navbar-expand navbar-light bg-white">
-                <a class="sidebar-toggle d-flex mr-2"> <i
-                    class="hamburger align-self-center"></i>
-                </a>
-
-                <div class="navbar-collapse collapse">
-                    <ul class="navbar-nav ml-auto">
-                        <li class="nav-item dropdown"><a
-                            class="nav-icon dropdown-toggle d-inline-block d-sm-none"
-                            href="#" data-toggle="dropdown"> <i
-                                class="align-middle"
-                                data-feather="settings"></i>
-                        </a> <a
-                            class="nav-link dropdown-toggle d-none d-sm-inline-block"
-                            href="#" data-toggle="dropdown"> <span
-                                class="text-dark">홍길동 선생님</span>
-                        </a>
-                            <div
-                                class="dropdown-menu dropdown-menu-right">
-                                <a class="dropdown-item"
-                                    href="pages-profile.html"><i
-                                    class="align-middle mr-1"
-                                    data-feather="user"></i> 정보변경</a> <a
-                                    class="dropdown-item" href="#"><i
-                                    class="align-middle mr-1"
-                                    data-feather="pie-chart"></i> 로그아웃</a>
-                            </div></li>
-                    </ul>
-                </div>
-            </nav>
+            <jsp:include page="${data._INCLUDE}/top.jsp"></jsp:include>
 
             <main class="content">
                 <div class="container-fluid p-0">

+ 1 - 30
src/main/webapp/WEB-INF/jsp/patient/info.jsp

@@ -100,36 +100,7 @@
         <jsp:include page="${data._INCLUDE}/sidebar.jsp"></jsp:include>
 
         <div class="main">
-            <nav class="navbar navbar-expand navbar-light bg-white">
-                <a class="sidebar-toggle d-flex mr-2"> <i
-                    class="hamburger align-self-center"></i>
-                </a>
-
-                <div class="navbar-collapse collapse">
-                    <ul class="navbar-nav ml-auto">
-                        <li class="nav-item dropdown"><a
-                            class="nav-icon dropdown-toggle d-inline-block d-sm-none"
-                            href="#" data-toggle="dropdown"> <i
-                                class="align-middle"
-                                data-feather="settings"></i>
-                        </a> <a
-                            class="nav-link dropdown-toggle d-none d-sm-inline-block"
-                            href="#" data-toggle="dropdown"> <span
-                                class="text-dark">홍길동 선생님</span>
-                        </a>
-                            <div
-                                class="dropdown-menu dropdown-menu-right">
-                                <a class="dropdown-item"
-                                    href="pages-profile.html"><i
-                                    class="align-middle mr-1"
-                                    data-feather="user"></i> 정보변경</a> <a
-                                    class="dropdown-item" href="#"><i
-                                    class="align-middle mr-1"
-                                    data-feather="pie-chart"></i> 로그아웃</a>
-                            </div></li>
-                    </ul>
-                </div>
-            </nav>
+            <jsp:include page="${data._INCLUDE}/top.jsp"></jsp:include>
 
             <main class="content">
                 <div class="container-fluid p-0">

+ 1 - 23
src/main/webapp/WEB-INF/jsp/patient/list.jsp

@@ -112,29 +112,7 @@
         <jsp:include page="${data._INCLUDE}/sidebar.jsp"></jsp:include>
 
         <div class="main">
-            <nav class="navbar navbar-expand navbar-light bg-white">
-                <a class="sidebar-toggle d-flex mr-2"> <i
-                    class="hamburger align-self-center"></i>
-                </a>
-
-                <div class="navbar-collapse collapse">
-                    <ul class="navbar-nav ml-auto">
-                        <li class="nav-item dropdown">
-                            <a class="nav-icon dropdown-toggle d-inline-block d-sm-none" href="#" data-toggle="dropdown">
-                                <i class="align-middle" data-feather="settings"></i>
-                            </a>
-
-                            <a class="nav-link dropdown-toggle d-none d-sm-inline-block" href="#" data-toggle="dropdown">
-                                <span class="text-dark">홍길동 선생님</span>
-                            </a>
-                            <div class="dropdown-menu dropdown-menu-right">
-                                <a class="dropdown-item" href="pages-profile.html"><i class="align-middle mr-1" data-feather="user"></i> 정보변경</a>
-                                <a class="dropdown-item" href="#"><i class="align-middle mr-1" data-feather="pie-chart"></i> 로그아웃</a>
-                            </div>
-                        </li>
-                    </ul>
-                </div>
-            </nav>
+            <jsp:include page="${data._INCLUDE}/top.jsp"></jsp:include>
 
             <main class="content">
                 <div class="container-fluid p-0">

+ 1 - 30
src/main/webapp/WEB-INF/jsp/patient/new.jsp

@@ -111,36 +111,7 @@
         <jsp:include page="${data._INCLUDE}/sidebar.jsp"></jsp:include>
 
         <div class="main">
-            <nav class="navbar navbar-expand navbar-light bg-white">
-                <a class="sidebar-toggle d-flex mr-2"> <i
-                    class="hamburger align-self-center"></i>
-                </a>
-
-                <div class="navbar-collapse collapse">
-                    <ul class="navbar-nav ml-auto">
-                        <li class="nav-item dropdown"><a
-                            class="nav-icon dropdown-toggle d-inline-block d-sm-none"
-                            href="#" data-toggle="dropdown"> <i
-                                class="align-middle"
-                                data-feather="settings"></i>
-                        </a> <a
-                            class="nav-link dropdown-toggle d-none d-sm-inline-block"
-                            href="#" data-toggle="dropdown"> <span
-                                class="text-dark">홍길동 선생님</span>
-                        </a>
-                            <div
-                                class="dropdown-menu dropdown-menu-right">
-                                <a class="dropdown-item"
-                                    href="pages-profile.html"><i
-                                    class="align-middle mr-1"
-                                    data-feather="user"></i> 정보변경</a> <a
-                                    class="dropdown-item" href="#"><i
-                                    class="align-middle mr-1"
-                                    data-feather="pie-chart"></i> 로그아웃</a>
-                            </div></li>
-                    </ul>
-                </div>
-            </nav>
+            <jsp:include page="${data._INCLUDE}/top.jsp"></jsp:include>
 
             <main class="content">
                 <div class="container-fluid p-0">

+ 1 - 30
src/main/webapp/WEB-INF/jsp/patient/privacy.jsp

@@ -99,36 +99,7 @@
         <jsp:include page="${data._INCLUDE}/sidebar.jsp"></jsp:include>
 
         <div class="main">
-            <nav class="navbar navbar-expand navbar-light bg-white">
-                <a class="sidebar-toggle d-flex mr-2"> <i
-                    class="hamburger align-self-center"></i>
-                </a>
-
-                <div class="navbar-collapse collapse">
-                    <ul class="navbar-nav ml-auto">
-                        <li class="nav-item dropdown"><a
-                            class="nav-icon dropdown-toggle d-inline-block d-sm-none"
-                            href="#" data-toggle="dropdown"> <i
-                                class="align-middle"
-                                data-feather="settings"></i>
-                        </a> <a
-                            class="nav-link dropdown-toggle d-none d-sm-inline-block"
-                            href="#" data-toggle="dropdown"> <span
-                                class="text-dark">홍길동 선생님</span>
-                        </a>
-                            <div
-                                class="dropdown-menu dropdown-menu-right">
-                                <a class="dropdown-item"
-                                    href="pages-profile.html"><i
-                                    class="align-middle mr-1"
-                                    data-feather="user"></i> 정보변경</a> <a
-                                    class="dropdown-item" href="#"><i
-                                    class="align-middle mr-1"
-                                    data-feather="pie-chart"></i> 로그아웃</a>
-                            </div></li>
-                    </ul>
-                </div>
-            </nav>
+            <jsp:include page="${data._INCLUDE}/top.jsp"></jsp:include>
 
             <main class="content">
                 <div class="container-fluid p-0">

+ 1 - 1
src/main/webapp/resources/css/common/classic.css

@@ -85,5 +85,5 @@
 .patients-stats .temperature.step2 { color:#dc3545; }
 .patients-stats .temperature.step3 { background-color: #EFCDD1; color:#dc3545; }
 .graph-area {  }
-.error{color:red;}
+.error{color:red;margin:0;}
 .mt8{margin-top:8px;}