상품관리 (관리자 로그인/로그아웃)

Back-End/Spring 2019. 6. 17. 14:01
728x90
반응형

  -관리자 로그인/로그아웃 기능 구현-


   

  

  -관리자 로그인 전체 구조-


  ( 뷰 => 컨트롤러 => 서비스 => 모델(DAO) => mapper => 컨트롤러 => 뷰)

   

  (admin) login 페이지에서 로그인 버튼을 클릭하면 id값인 "btnLogin"가 


  login 페이지 상부에 있는 자바스크립트 구문에 EL태그에 맵핑되서 click()메소드


  안에 있는 함수가 실행되서 userid값과 passwd값을 가져와 내가 입력한 id값과 pass값과


  맞는지 확인해서 일치하면 Admincontroller에 있는 login_check.do에 맵핑되어 있는 메소드와 연결한다.


  맵핑된 메소드에서는 서비스를 호출하고 서비스에서는 dto를 매개값으로 받아서 DAO에 리턴한다.


  DAO에서는 mybatis mapper을 호출해야하기 때문에 의존성을 주입한 sqlsession을 사용하고,


  DAO 인터페이스에서 만든 메소드를 구현해서 namespace값과 id값, resultType을 확인해 일치하는


  Mapper에 연결해서 sql쿼리를 (dto를 매개값으로 삼아서) sqlsession에 담는다.


  다시 controller로 돌아와서 name(서비스에 담긴값을 저장한 변수)에 담긴 값이 null이 아니면 (로그인이 성공했다면..)


  session에 setAttribute()메소드를 사용해서 관리자 id와 이름을 session에 저장하고,


  ModelAndView 타입의 변수를 사용해서 보여줄 페이지와 보낼 값(로그인 성공 메시지)을 설정한다.


  로그인이 성공하면 View (admin)페이지로 이동하고, 넘어갈때 success (메시지 값)이 같이 넘어갔기 때문에


  ex) dlgkstjq12(이한섭)님 환영합니다. 와 같이 출력이 된다.






  -관리자 로그아웃 전체 구조-


  (뷰 => 컨트롤러 => 뷰)


  View에 있는 logout.do와 controller에 있는 logout.do를 맵핑해서 session의 invalidate( ) 메소드를 실행한다.


  invalidate( ) 메소드는 session 내부에있는 데이터를 초기화 시키는 메소드이다. 삭제 시킨후에는 redirect로 login페이지로 이동한다.






관리자 테이블 만들기


관리자가 로그인 한 후에 상품의 정보를 수정, 추가, 삭제 할 수 있도록 할 예정

권한에다가 1부터 9까지 주고, 예를 들면 숫자 9면 최고 관리자라는 식으로 할 수도 있다.


1
2
3
4
5
6
7
8
create table admin (
userid varchar2(50not null, //not null은 null값이 들어가지 못한다는 의미
passwd varchar2(50not null,
name varchar2(50not null,
email varchar2(100),
join_date date default sysdate,
primary key(userid)
);
cs


1
insert into admin (userid, passwd, name) values ('admin','1234','관리자');
cs


1
commit;
cs



AdminDAO.java

1
2
3
4
5
6
7
8
package com.example.spring02.model.admin;
 
import com.example.spring02.model.member.dto.MemberDTO;
 
public interface AdminDAO {
    public String loginCheck(MemberDTO dto); //dto를 받아서 관리자 로그인을 체크하는 메소드
}
 

cs



AdminDAOImpl.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package com.example.spring02.model.admin;
 
import javax.inject.Inject;
 
import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;
 
import com.example.spring02.model.member.dto.MemberDTO;
 
@Repository //DAO를 구현한 클래스이므로 Repository 어노테이션을 사용
public class AdminDAOImpl implements AdminDAO {
 
    @Inject //mybatis mapper을 호출해야 하므로 sqlsession에 inject로 의존성을 주입하고 사용한다.
    SqlSession sqlSession;
    
    @Override 
    //DAO 인터페이스에서 만든 메소드를 구현
    public String loginCheck(MemberDTO dto) {
        return sqlSession.selectOne("admin.login_check", dto);
//sqlsession에 mapper에 맵핑된 namespace와 id로 sql문을 저장한다.
    }
}
cs



adminMapper.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 
<!-- 다른 mapper와 중복되지 않도록 네임스페이스 기재 -->
<mapper namespace="admin">
    <select id="login_check" resultType="String">
        select name 
        from admin
        where userid=#{userid} and passwd=#{passwd}
    </select>
</mapper>
cs



AdminService.java

1
2
3
4
5
6
7
package com.example.spring02.service.admin;
 
import com.example.spring02.model.member.dto.MemberDTO;
 
public interface AdminService {
    public String loginCheck(MemberDTO dto); //dto에 저장되어있는 정보를 받아 로그인을 체크하는 메소드
}
cs



AdminServiceImpl.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.example.spring02.service.admin;
 
import javax.inject.Inject;
 
import org.springframework.stereotype.Service;
 
import com.example.spring02.model.admin.AdminDAO;
import com.example.spring02.model.member.dto.MemberDTO;
 
@Service
//service이므로 service어노테이션을 사용함
public class AdminServiceImpl implements AdminService {
 
    @Inject
    AdminDAO adminDao;
    //dao를 호출해야하므로 inject로 의존성을 주입하고 사용
    
    @Override
    public String loginCheck(MemberDTO dto) {
        return adminDao.loginCheck(dto);
        //dto에서 정보를 받고 dao에 리턴한다.
    }
}
cs



AdminController.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
package com.example.spring02.controller.admin;
 
import javax.inject.Inject;
import javax.servlet.http.HttpSession;
 
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
 
import com.example.spring02.model.member.dto.MemberDTO;
import com.example.spring02.service.admin.AdminService;
 
@Controller
//컨트롤러로 사용하기위한 어노테이션 사용
 
@RequestMapping("/admin/*")
//RequestMapping를 사용해서 공통된 부분을 맵핑
 
public class AdminController {
    
    @Inject
    AdminService adminService; //service객체를 사용해야 하므로 inject로 의존성을 주입받아서 스프링에서 관리하게 한다.
        
    @RequestMapping("login.do")
    // view (menu.jsp)에서 RequestMapping된 메소드    
    public String login() {
        return "admin/login"; //admin디렉터리 하위에 있는 login.jsp 파일을 보여준다는 뜻
    }
    
    //view에서 login_check.do를 맵핑하면 이 메소드가 호출된다. 
    @RequestMapping("login_check.do")
    public ModelAndView login_check(
            //이 메소드는 dto, session, mav를 매개값으로 받고, session안에 setAttribute 메소드를 사용해서 값들을 저장한다.
            
            MemberDTO dto, HttpSession session, ModelAndView mav) {
        //ModelAndView는 데이터를 출력할 페이지와 전송을 동시에 함
        String name=adminService.loginCheck(dto);
        if(name != null) { //로그인 성공 (그러니까 loginCheck()메소드 안에 이름이 저장되어있다는 뜻)
            
            //dto에서 Userid()를 받아와 admin_userid라는 이름으로 session에 setAttribute()메소드를 사용해서 저장하고
            //name도 마찬가지로 session에 저장한다.
            session.setAttribute("admin_userid", dto.getUserid());
            session.setAttribute("admin_name", name);
                        
            //dto에서 Userid()를 받아와 userid라는 이름으로 session에 setAttribute() 메소드를 사용해서 저장하고
            //name도 마찬가지로 session에 저장한다.
            session.setAttribute("userid", dto.getUserid());
            session.setAttribute("name", name);
            
            mav.setViewName("admin/admin");      //admin페이지를 보여준다는 뜻
            mav.addObject("message""success"); //mav안에 있는 addObject()메소드를 사용해 message라는 키에 sucess라는 value를 담아 보낸다
        }else {
            
            mav.setViewName("admin/login");    //관리자 로그인이 실패했을때 보여주는 페이지
            mav.addObject("message""error");   //error메시지를 출력한다.
        }
        return mav; 
    }
        
    //관리자 로그아웃 처리
    //View에 있는 logout.do를 맵핑
    @RequestMapping("logout.do")
    public String logout(HttpSession session) {
        session.invalidate();
        //로그아웃을 시키려면 session에 있는 데이터를 삭제시켜야 하기 때문에 invalidate()메소드를 사용해서
        //안에 있는 데이터를 초기화 시킨다.
        
        return "redirect:/admin/login.do";
        //데이터를 삭제시킨후에는 login페이지로 돌아가도록 한다.
    }
}
cs



login.jsp (관리자용)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<!-- 관리자 로그인 페이지 -->
<%@ include file="../include/header.jsp"%>
 
 
<script>
//button을 클릭하면 아이디와 비밀번호를 처리해서 Controller에 있는 login_check로 맵핑시킨다.
//아이디와 비밀번호를 받아 처리하는 자바스크립트 구문
$(function(){
    $("#btnLogin").click(function(){       //밑에 있는 button태그로 쓴 id값이  이쪽으로 맵핑되서 넘어오고, click()메소드 안에 함수가 실행 
        var userid=$("#userid").val();     //밑에있는 input문으로 가져온 userid의 값을 val()메소드를 사용해 가져오고, 그 값을 userid 변수에 넣는다.
        var passwd=$("#passwd").val();     //밑에 있는 input문으로 가져온 passwd의 값을 val()메소드를 사용해 가져오고, 그 값을 passwd 변수에 넣는다.
        if(userid == ""){                   //userid에 아무것도 입력이 되지 않으면
            alert("아이디를 입력하세요.");       //경고창 출력
            $("#userid").focus();          //focus()메소드는 커서를 옮겨놓는 효과, 그러니까 아이디 입력창에 자동으로 커서가 옮겨져 있는다. 깜빡이게끔
            return;
        }
        
        if(passwd==""){                    //마찬가지로 passwd가 아무것도 입력이 되지 않으면
            alert("비밀번호를 입력하세요.");   //경고창 출력
            $("#passwd").focus();        //focus()메소드는 커서를 옮겨놓는 효과, 그러니까 아이디 입력창에 자동으로 커서가 옮겨져 있는다. 깜빡이게끔
            return;
        }
        
        document.form1.action = "${path}/admin/login_check.do";  //밑에 form1 폼을 Controller의 login_check에 맵핑하도록 한다.
        document.form1.submit(); //자료를 선송
    });
});
 
</script>
</head>
<body>
    <%@ include file="../include/menu.jsp"%>
    <h2>관리자 로그인</h2>
    <form name="form1" method="post">
 
        <table border="1" method="post">
 
            <tr>
                <td>아이디</td>
                <td><input id="userid" name="userid"></td>
            </tr>
 
            <tr>
                <td>비밀번호</td>
                <td><input type="password" id="passwd" name="passwd"></td>
            </tr>
 
            <tr>
                <td colspan="2" align="center">
                    <button type="button" id="btnLogin">로그인</button> <c:if
                        test="${param.message == 'nologin' }">
                        <div style="color: red;">먼저 로그인하세요.</div>
                    </c:if> <!-- c:if문 test의 값이 참이면 실행. (로그인이 아예안되어 있으면 실행)--> <!-- 로그인이 안되었다는 값이 넘어오면 빨간색으로 경고창 출력-->
 
 
                    <c:if test="${message == 'error' }">
                        <div style="color: red;">아이디 또는 비밀번호가 일치하지 않습니다.</div>
                    </c:if> <!-- c:if문 test의 값이 참이면 실행. (아이디나 비밀번호중 하나가 일치하지 않으면)--> <!-- 아이디나 비밀번호가 일치하지 않으면 빨간색으로 경고 메시지 출력-->
 
                    <c:if test="${message == 'logout' }">
                        <div style="color: red;">로그아웃되었습니다.</div>
                    </c:if> <!-- c:if문 test의 값이 참이면 실행. 로그아웃 메시지가 출력되면....--> <!-- 로그아웃이 되면 로그아웃되었습니다. 메시지를 출력함-->
 
                </td>
            </tr>
        </table>
    </form>
</body>
</html>
cs



admin.jsp (관리자 로그인시 출력되는 페이지)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<%@ include file="../include/header.jsp" %>
</head>
<body>
<%@ include file="../include/admin_menu.jsp" %>
 
<c:if test="${message == 'success' }"<!-- controller에서 보낸 메시지의 값이 success면 c:if문이 실행이 된다.-->
<h2>
    ${sessionScope.admin_name}
    (${sessionScope.admin_userid})님 환영합니다.
    <!--sessionScope는 세션에 담은 setAttribute()메소드 안에 있는 값을 jsp에서 JSTL로 간단히 사용하고 싶을때 사용하면 된다. -->
    <!--ex) dlgkstjq12(이한섭)님 환영합니다. 와 같이 출력됨.  -->
    
</h2>
</c:if>
</body>
</html>
cs




728x90
반응형
: