본문 바로가기

SpringBoot

ch2 10. 로그인화면 만들기

- index.html

메인 화면 
여기서 Login 클릭하면 Login 화면이 나타난다. 

 

- login.html

id, pwd입력 후 로그인을 클릭하면 이걸 Login 컨트롤러가 받는다. 

받아서 id와 pwd가 맞는지 판단한다.

 
맞으면 userInfo.html -> id와 pwd가 보여지게함

안맞으면 다시 로그인 화면으로 

 

* 프로그램을 짜기 전에 흐름을 그려보는게 중요하다 !! * 

 

<HomeController>

package com.fastcampus.ch2;


import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

// 1. 원격 프로그램으로 등록
@Controller
public class HomeController { // 원격 프로그램
    // 2. URL과 메소드를 연결
    @RequestMapping("/")
    public String main() {
        return "index"; // templates/index.html
    }
}

 

<index.html>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>index.html</h1>
<a href="/login/login">Login</a>
</body>
</html>

 

Login을 누르면 로그인 화면으로 이동한다.(/login/login)

 

<LoginController>

package com.fastcampus.ch2;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
@RequestMapping ("/login")// 클래스 앞에 @RequestMapping("/login") 써주면 /login/login -> /login으로 생략 가능
public class LoginController {
//    @RequestMapping(value = "/login/login", method = RequestMethod.GET) // 아래와 같다. 기본은 GET
//    @RequestMapping("/login/login") // 더 짧게 아래 문장과 같이 사용 가능
    @GetMapping("/login")
    public String showLogin() {
        return "login"; // login.html
    }

    //  하나의 메소드로 GET, POST 둘 다 처리하는 경우
    //    @RequestMapping(value = "/login/login", method = {RequestMethod.POST,RequestMethod.GET})
    //    @RequestMapping(value = "/login/login", method = RequestMethod.POST) // 아래와 같다.
    @PostMapping("/login")
    public String login(String id, String pwd, Model model) {
        // 1. id, pwd를 확인
        if(loginCheck(id,pwd)) {
            // 2. 일치하면, userInfo.html
            model.addAttribute("id", id);
            model.addAttribute("pwd", pwd);
            return "userInfo"; // userInfo.html
        } else {
            // 일치하지 않으면, login.html로 이동
            return "redirect:/login/login"; // redirect는 GET요쳥 -> GetMapping("/login") 받음
        }
    }

    private boolean loginCheck(String id, String pwd) {
        return id.equals("asdf") && pwd.equals("1234");
    }
}

GET 요청을 받아 showLogin() 메소드가 login.html을 보여준다.

 

<login.html>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/login/login" method="post">
    id<br>
    <input type="text" name="id"><br>
    pwd:<br>
    <input type="password" name="pwd"><br>
    <input type="submit" value="로그인">

</form>
</body>
</html>

아이디와 패스워드를 입력하고 로그인을 누르면, form의 action에 지정된 곳으로 입력한 데이터가 post로 보내진다.
그러면 /login/login 주소로 post 요청이 가게 되는 것이다. 

LoginController에서 post요청을 받아서 id, pwd가 일치하는지 확인한 후 일치하면 userInfo.html로 이동한다. 

 

 

<userInfo.html>

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1 th:text="|id=${id}|">asdf</h1 > 
<h1 th:text="|pwd=${pwd}|">asdf</h1 >
</body>
</html>

단항 문자열이 들어갈 때는 | |를 앞 뒤에 붙여줘야한다. (${id} 이렇게 쓸 때는 에러 안남)

이 때 패스워드를 다른걸 입력하면 다시 로그인 화면으로 돌아가는 것을 확인할 수 있다. (GET 방식으로 돌아감)

 

   @PostMapping("/login")
    public String login(String id, String pwd, Model model) throws Exception{
        // 1. id, pwd를 확인
        if(loginCheck(id,pwd)) {
            // 2. 일치하면, userInfo.html
            model.addAttribute("id", id);
            model.addAttribute("pwd", pwd);
            return "userInfo"; // userInfo.html
        } else {
            // 일치하지 않으면, login.html로 이동
            String msg = URLEncoder.encode("id 또는 패스워드가 일치하지 않습니다.", "utf-8");
            return "redirect:/login/login?msg=" + msg; // redirect는 GET요쳥 -> GetMapping("/login") 받음
        }
    }

패스워드가 일치하지 않을 경우 메시지를 출력해주는 코드를 추가해보자.
URL 인코딩을 통해 한글이 깨지지 않도록 설정해주고, 해당 메시지를 보여주기 위해서는 login.html도 수정이 필요하다.

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1 th:text = "${param.msg}"></h1>
<form action="/login/login" method="post">
    id<br>
    <input type="text" name="id"><br>
    pwd:<br>
    <input type="password" name="pwd"><br>
    <input type="submit" value="로그인">

</form>
</body>
</html>

&{msg} 로 사용하면 쿼리 스트링에 들어가기 때문에 &{param.msg} 이렇게 사용해여 모델에 저장된다. 
이렇게 해야 쿼리스트링에서 msg를 찾아서 보여주게 된다. 

이렇게 잘 나오면 성공이다.