로그인 페이지
loginForm.jsp
<%@ page contentType="text/html;charset=utf-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page import="java.net.URLDecoder" %>
<!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>Login</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.8.2/css/all.min.css" />
<style>
* { box-sizing:border-box; }
a { text-decoration: none; }
form {
width:400px;
height:500px;
display : flex;
flex-direction: column;
align-items:center;
position : absolute;
top:50%;
left:50%;
transform: translate(-50%, -50%) ;
border: 1px solid rgb(89,117,196);
border-radius: 10px;
}
input[type='text'], input[type='password'] {
width: 300px;
height: 40px;
border : 1px solid rgb(89,117,196);
border-radius:5px;
padding: 0 10px;
margin-bottom: 10px;
}
button {
background-color: rgb(89,117,196);
color : white;
width:300px;
height:50px;
font-size: 17px;
border : none;
border-radius: 5px;
margin : 20px 0 30px 0;
}
#title {
font-size : 50px;
margin: 40px 0 30px 0;
}
#msg {
height: 30px;
text-align:center;
font-size:16px;
color:red;
margin-bottom: 20px;
}
</style>
</head>
<body>
<form action="<c:url value='/login/login'/>" method="post" onsubmit="return formCheck(this);">
<h3 id="title">Login</h3>
<div id="msg">
<c:if test="${not empty param.msg}">
<i class="fa fa-exclamation-circle"> ${URLDecoder.decode(param.msg)}</i>
</c:if>
</div>
<input type="text" name="id" placeholder="이메일 입력" autofocus>
<input type="password" name="pwd" placeholder="비밀번호">
<button>로그인</button>
<div>
<label><input type="checkbox" name="rememberId"> 아이디 기억</label> |
<a href="">비밀번호 찾기</a> |
<a href="">회원가입</a>
</div>
<script>
function formCheck(frm) {
let msg ='';
if(frm.id.value.length==0) {
setMessage('id를 입력해주세요.', frm.id);
return false;
}
if(frm.pwd.value.length==0) {
setMessage('password를 입력해주세요.', frm.pwd);
return false;
}
return true;
}
function setMessage(msg, element){
document.getElementById("msg").innerHTML = ` ${'${msg}'}`;
if(element) {
element.select();
}
}
</script>
</form>
</body>
</html>
LoginController.java
package com.jcy.usedhunter;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/login")
public class LoginController {
@GetMapping("/login")
public String loginForm() {
return "loginForm";
}
@PostMapping("/login")
public String login(String id, String pwd, String rememberId) throws Exception {
// 1. id와 pwd를 확인
if(!loginCheck(id, pwd)) {
String msg = URLEncoder.encode("id 또는 pwd가 일치하지 않습니다.", "utf-8");
// 2-1. 일치하지 않으면 loginForm 으로 이동
return "redirect:/login/login?msg="+msg;
}
// 2-2. id와 pwd가 일치하면 홈으로 이동
return "redirect:/";
}
private boolean loginCheck(String id, String pwd) {
return "asdf".equals(id) && "1234".equals(pwd);
}
}
loginForm.jsp
<%@ page contentType="text/html;charset=utf-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page import="java.net.URLDecoder" %>
<!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>Login</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.8.2/css/all.min.css" />
<style>
* { box-sizing:border-box; }
a { text-decoration: none; }
form {
width:400px;
height:500px;
display : flex;
flex-direction: column;
align-items:center;
position : absolute;
top:50%;
left:50%;
transform: translate(-50%, -50%) ;
border: 1px solid rgb(89,117,196);
border-radius: 10px;
}
input[type='text'], input[type='password'] {
width: 300px;
height: 40px;
border : 1px solid rgb(89,117,196);
border-radius:5px;
padding: 0 10px;
margin-bottom: 10px;
}
button {
background-color: rgb(89,117,196);
color : white;
width:300px;
height:50px;
font-size: 17px;
border : none;
border-radius: 5px;
margin : 20px 0 30px 0;
}
#title {
font-size : 50px;
margin: 40px 0 30px 0;
}
#msg {
height: 30px;
text-align:center;
font-size:16px;
color:red;
margin-bottom: 20px;
}
</style>
</head>
<body>
<form action="<c:url value='/login/login'/>" method="post" onsubmit="return formCheck(this);">
<h3 id="title">Login</h3>
<div id="msg">
<c:if test="${not empty param.msg}">
<i class="fa fa-exclamation-circle"> ${URLDecoder.decode(param.msg)}</i>
</c:if>
</div>
<input type="text" name="id" placeholder="이메일 입력" autofocus>
<input type="password" name="pwd" placeholder="비밀번호">
<button>로그인</button>
<div>
<label><input type="checkbox" name="rememberId"> 아이디 기억</label> |
<a href="">비밀번호 찾기</a> |
<a href="">회원가입</a>
</div>
<script>
function formCheck(frm) {
let msg ='';
if(frm.id.value.length==0) {
setMessage('id를 입력해주세요.', frm.id);
return false;
}
if(frm.pwd.value.length==0) {
setMessage('password를 입력해주세요.', frm.pwd);
return false;
}
return true;
}
function setMessage(msg, element){
document.getElementById("msg").innerHTML = ` ${'${msg}'}`;
if(element) {
element.select();
}
}
</script>
</form>
</body>
</html>
index.jsp
로그인 성공 시 보여줄 home 페이지
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>fastcampus</title>
<link rel="stylesheet" href="<c:url value='/css/menu.css'/>">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.8.2/css/all.min.css"/>
</head>
<body>
<div id="menu">
<ul>
<li id="logo">fastcampus</li>
<li><a href="<c:url value='/'/>">Home</a></li>
<li><a href="<c:url value='/board/list'/>">Board</a></li>
<li><a href="<c:url value='/login/login'/>">login</a></li>
<li><a href="<c:url value='/register/add'/>">Sign in</a></li>
<li><a href=""><i class="fas fa-search small"></i></a></li>
</ul>
</div>
<div style="text-align:center">
<h1>This is HOME</h1>
<h1>This is HOME</h1>
<h1>This is HOME</h1>
</div>
index.jsp 에 적용될 menu.css 파일을 resource/css/menu.css 경로로 만들자
menu.css
* {
box-sizing: border-box;
margin : 0;
padding: 0;
}
a { text-decoration: none; }
ul {
list-style-type: none;
height: 48px;
width: 100%;
background-color: #30426E;
display: flex;
}
ul > li {
color: lightgray;
height : 100%;
width:90px;
display:flex;
align-items: center;
}
ul > li > a {
color: lightgray;
margin:auto;
padding: 10px;
font-size:20px;
align-items: center;
}
ul > li > a:hover {
color :white;
border-bottom: 3px solid rgb(209, 209, 209);
}
#logo {
color:white;
font-size: 18px;
padding-left:40px;
margin-right:auto;
display: flex;
}
쿠키
이름과 값의 쌍으로 구성된 작은 정보. 아스키 문자만 가능
쿠키의 생성
Cookie cookie = new Cookie("id", "asdf"); // 쿠키 생성
cookie.setMaxAge(60*60*24); // 유효기간 설정(초)
response.addCookie(cookie); // 응답에 쿠키 추가
삭제, 변경
Cookie cookie = new Cookie("id", ""); // 변경할 쿠키와 같은 이름 쿠키 생성
cookie.setMaxAge(0); // 유효기간을 0으로 설정(삭제)
response.addCookie(cookie); // 응답에 쿠키 추가
Cookie cookie = new Cookie("id", ""); // 쿠키 생성
cookie.setValue(URLEncoder.encode("kim")); // 값의 변경
cookie.setDomain("www.fdsfdsf.com); // 도메인의 변경
cookie.setPath("/app"); // 경로의 변경
cookie.setMaxAge(60*60*24); // 유효기간 변경(초)
response.addCookie(cookie); // 응답에 쿠키 추가
Cookie[] cookies = request.getCookies(); // 쿠키 읽기
for(Cookie cookie : cookies){
String name = cookie.getName();
String value = cookie.getValue();
}
쿠키를 이용하여 아이디 기억 기능 만들기
EL을 사용하여 쿠키의 id 값을 받아오자
그리고 값이 없으면 "" 을 있으면 "checked" 를 아이디 기억 checkbox 태크에 생성
<input type="text" name="id" value="${cookie.id.value}" placeholder="이메일 입력" autofocus>
<input type="password" name="pwd" placeholder="비밀번호">
<button>로그인</button>
<div>
<label><input type="checkbox" name="rememberId" ${empty cookie.id.value ? "":"checked" }> 아이디 기억</label> |
<a href="">비밀번호 찾기</a> |
<a href="">회원가입</a>
LoginController.java
login 메서드 파라미터에 rememberId 타입을 boolean 으로 변경하고
생성된 쿠키를 담을 HttpServletResponse 를 추가하자
package com.jcy.usedhunter;
import java.net.URLEncoder;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/login")
public class LoginController {
@GetMapping("/login")
public String loginForm() {
return "loginForm";
}
@PostMapping("/login")
public String login(String id, String pwd, boolean rememberId, HttpServletResponse response) throws Exception {
// 1. id와 pwd를 확인
if(!loginCheck(id, pwd)) {
String msg = URLEncoder.encode("id 또는 pwd가 일치하지 않습니다.", "utf-8");
// 2-1. 일치하지 않으면 loginForm 으로 이동
return "redirect:/login/login?msg="+msg;
}
// 2-2. id와 pwd가 일치하면
if(rememberId) {
// 1. 쿠키를 생성
Cookie cookie = new Cookie("id", id);
// 2. 응답에 저장
response.addCookie(cookie);
} else {
// 쿠키를 삭제
Cookie cookie = new Cookie("id", id);
cookie.setMaxAge(0);
response.addCookie(cookie);
}
// 3. 홈으로 이동
return "redirect:/";
}
private boolean loginCheck(String id, String pwd) {
return "asdf".equals(id) && "1234".equals(pwd);
}
}
'프로젝트 > 중고헌터' 카테고리의 다른 글
중고헌터 - 로그인 페이지 만들기3 (1) | 2022.09.21 |
---|---|
중고헌터 - 로그인 페이지 만들기2 (0) | 2022.09.20 |
중고헌터 - 회원가입 페이지 만들기2 (0) | 2022.09.18 |
중고헌터 - 회원가입 페이지 만들기 (0) | 2022.09.18 |
중고헌터 - mybatis 설정 (0) | 2022.09.15 |