ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 02.세션을 이용한 로그인.
    스프링 웹 개발 하기/로그인 처리 2020. 2. 9. 17:21

    보기전에 스프링 구조(2)를 참조.

    Spring_blog.zip
    0.08MB

    Session은 서버에 어떤 값의 정보를 저장해서 해당 정보를 사용하는 방법입니다.(로그인 같은 경우 사용자 정보.)

    그렇기 때문에 브라우저를 닫으면 세션이 끊겨서 해당 정보가 지워지게 됩니다.

    1.Mapper 만들기

    상세 정보는 1.스프링 구조쪽 참조.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?xml version="1.0" encoding="UTF-8" ?>
     
    <mapper namespace="member">
        <select id="login" resultType="MemberVO">
            select * from tbl_member
            where key = #{key}
            and pw = #{pw}
            and interlock_type = 'main'
        </select>
    </mapper>

    2.TEST 쿼리

    1
    2
    3
    4
    insert into tbl_member
    (key,pw,name,email,nickname,auth,interlock_type,regdate)
    values
    ('admin','1234','전승우','aa@naver.com','woo','1','main',now())
    interlock_type은 나중에 로그인 종류를 나누기 위해서 입니다. session 만 할거면 필요 없어요. 

    3.DAO 만들기

    1
    2
    3
    4
    public interface MemberDAO {
        public MemberVO login(MemberVO vo)throws Exception;
    }
     
    1
    2
    3
    4
    5
    6
    7
    8
    9
    @Repository
    public class MemberDAOImpl implements MemberDAO {
        @Inject
        private SqlSession session;
        @Override
        public MemberVO login(MemberVO vo) throws Exception {
            return session.selectOne("member.login", vo);
        }
    }

    interface를 만들고 implements로 해당 DAO를 받는다.

    3.Service 만들기

    1
    2
    3
    4
    public interface MemberService {
        public MemberVO login(MemberVO vo)throws Exception;
    }
     
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    @Service
    public class MemberServiceImpl implements MemberService{
        @Inject
        private MemberDAO dao;
        @Override
        public MemberVO login(MemberVO vo) throws Exception {
            return dao.login(vo);
        }
    }
     

    4.Controller 만들기

    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
    @RequestMapping("/member/*")
    @Controller
    public class MemberController {
     
        @Inject
        private MemberService service;
     
        // 로그인 폼을 띄우는 부분
        @RequestMapping(value = "/loginForm", method = RequestMethod.GET)
        public String loginForm() {
            return "member/loginForm"// /login/loginForm.jsp를 띄움.
        }// end of loginForm
     
        // 로그인 처리하는 부분
        @RequestMapping(value = "/loginProcess", method = RequestMethod.POST)
        public String loginProcess(HttpSession session, MemberVO dto) throws Exception {
            String returnURL = "";
            if (session.getAttribute("login"!= null) {
                // 기존에 login이란 세션 값이 존재한다면 기존값을 제거해 준다.
                session.removeAttribute("login");
            }
     
            // 로그인이 성공하면 MemberVO 객체를 반환한다.
            MemberVO vo = service.login(dto);
            System.out.println(vo);
            // 로그인 성공
            if (vo != null) { 
                // 세션에 login인이란 이름으로 MemberVO 객체를 저장해 놓는다.
                session.setAttribute("login", vo);
                // 로그인 성공시 이동
                returnURL = "redirect:/member/success"
            } else { 
                // 로그인에 실패한 경우 이동
                returnURL = "redirect:/member/loginForm"
            }
            return returnURL; // 위에서 설정한 returnURL 을 반환해서 이동시킴
        }
     
        // 로그아웃 하는 부분
        @RequestMapping(value = "/logout")
        public String logout(HttpSession session) {
            session.invalidate(); // 세션 전체를 날려버림
            // session.removeAttribute("login"); // 하나씩 하려면 이렇게 해도 됨.
            return "redirect:/member/loginForm"// 로그아웃 후 게시글 목록으로 이동하도록 한다.
        }
        
        @RequestMapping(value = "/success")
        public String success(HttpSession session) {
            return "member/success"// Session Test
        }
    }
     

    5.JSP 만들기

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <body>
    <form action="/member/loginProcess" id="form" method="post">
      <div id="login">
           <input type="text"  name="key" placeholder="아이디" >
           <input type="password" name="pw" placeholder="비밀번호" > 
           <div class="buttonDiv">
             <button type="submit" class="btn1" id="loginBtn">로그인</button>
           </div>  
      </div>
    </form>  
    </body>

    디자인은 간편 디자인에서 로그인 쪽 참조. 

    6.Interceptor 설정.

    interceptor는 쉽게 생각하면은 어떤 정보의 데이터가 맞지 않으면 해당 설정의 경로에 들어갈 경우 다른 페이지로 이동하게 하기 위해서 사용 합니다.

    로그인을 예로 들면 해당 session에 로그인 정보가 없으면 특정 경로 (글쓰기 결제등)페이지에 들어가지 못하도록 막는 역할을 합니다.

    1)class 만들기(이름을 UserInterceptor로 만들었다.) 

       1.HandlerInterceptorAdapter 에 있는 preHandle,postHandle를 사용합니다.

    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
    public class UserInterceptor extends HandlerInterceptorAdapter {
        // preHandle() : 컨트롤러보다 먼저 수행되는 메서드
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
                throws Exception {
            // session 객체를 가져옴
            HttpSession session = request.getSession();
            // login처리를 담당하는 사용자 정보를 담고 있는 객체를 가져옴
            Object obj = session.getAttribute("login");
     
            if (obj == null) {
                // 로그인이 안되어 있는 상태임으로 로그인 폼으로 다시 돌려보냄(redirect)
                response.sendRedirect("/login");
                // 더이상 컨트롤러 요청으로 가지 않도록false로 반환함
                return false
            }
            // preHandle의return은 컨트롤러 요청 uri로 가도 되냐 안되냐를 허가하는 의미임
            // 따라서true로하면 컨트롤러 uri로 가게 됨.
            return true;
        }
        //controller의 메소드가 수행이 완료되고, view 를 호출하기 전에 호출됩니다.
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                ModelAndView modelAndView) throws Exception {
            super.postHandle(request, response, handler, modelAndView);
        }
    }
     

     

    2)xml 설정.(servlet-context.xml)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    <beans:bean id="UserInterceptor" class="org.woo.web.member.interceptor.UserInterceptor">
        </beans:bean>
        <!-- Interceptor 설정 -->
        <interceptors>
            <interceptor>
                <mapping path="/member/seccess"/>
                <beans:ref bean="UserInterceptor"/>
            </interceptor>
        </interceptors>

    <beans:bean id="UserInterceptor" class="org.woo.web.member.interceptor.UserInterceptor">

    1)에서 만든 class의 경로를 calss에 넣어준다. id는 아무렇게나 만들어도 된다.

    <mapping path="/member/seccess"/

    1)에서 설정한 데이터가 없으면 들어가지 못하도록 설정한 경로.

    <beans:ref bean="UserInterceptor"/

    위에 설정한  id 값을 넣어준다. 혹은 bean에 1)의 class경로를 넣어 주어도 된다.

     

Designed by Tistory.