์๋ ๋ก๊ทธ์ธ
ํ๋ฉด
์์ ์์
1.
persistence_logins.sql
2.
PersistenceLogins.java
3.
PersistenceLoginsDAO.java
4.
PersistenceLoginsService.java
5.
PersistenceLoginsServiceImpl.java
6.
UserServlet.java
7.
LoginFilter.java
์ฝ๋
persistence_logins.sql
DROP TABLE IF EXISTS `persistence_logins`;
CREATE TABLE `persistence_logins` (
`no` INT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '๋ฒํธ',
`id` VARCHAR(255) NOT NULL COMMENT 'ID (UUID)',
`username` VARCHAR(100) NOT NULL COMMENT 'ํ์ ์์ด๋',
`token` VARCHAR(255) NOT NULL COMMENT '์ธ์ฆ ํ ํฐ',
`expiry_date` TIMESTAMP NOT NULL COMMENT '๋ง๋ฃ์๊ฐ',
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '๋ฑ๋ก์ผ์',
`updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '์์ ์ผ์'
);
SQL
๋ณต์ฌ
PersistenceLogins.java
package board.DTO;
import java.util.Date;
import com.alohaclass.jdbc.annotation.*;
import lombok.*;
@Table("persistence_logins")
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class PersistenceLogins {
@Pk
private int no;
private String id;
private String username;
private String token;
private Date expiryDate;
private Date createdAt;
private Date updatedAt;
}
Java
๋ณต์ฌ
PersistenceLoginsDAO.java
package board.DAO;
import com.alohaclass.jdbc.dao.BaseDAOImpl;
import board.DTO.PersistenceLogins;
public class PersistenceLoginsDAO extends BaseDAOImpl<PersistenceLogins> {
}
Java
๋ณต์ฌ
PersistenceLoginsService.java
package board.Service;
import board.DTO.PersistenceLogins;
public interface PersistenceLoginsService {
// ํ ํฐ ๋ฑ๋ก
public PersistenceLogins insert(String username);
// ํ ํฐ ์กฐํ (์์ด๋)
public PersistenceLogins select(String username);
// ํ ํฐ ์กฐํ (ํ ํฐ)
public PersistenceLogins selectByToken(String token);
// ํ ํฐ ์์
public PersistenceLogins update(String username);
// ํ ํฐ ๊ฐฑ์ (์์ผ๋ฉด ๋ฑ๋ก, ์์ผ๋ฉด ์์ )
public PersistenceLogins refresh(String username);
// ํ ํฐ ์ ํจ์ฑ ์ฒดํฌ (๋ง๋ฃ์ฌ๋ถ ํ์ธ)
public boolean isValid(String token);
// ํ ํฐ ์ญ์
public boolean delete(String username);
}
Java
๋ณต์ฌ
PersistenceLoginsServiceImpl.java
package board.Service;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import board.DAO.PersistenceLoginsDAO;
import board.DTO.PersistenceLogins;
public class PersistenceLoginsServiceImpl implements PersistenceLoginsService {
private PersistenceLoginsDAO persistenceLoginsDAO = new PersistenceLoginsDAO();
@Override
public PersistenceLogins insert(String username) {
// ํ์ฌ ์๊ฐ + 7์ผ ํ ๊ณ์ฐ
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DAY_OF_YEAR, 7);
Date expiryDate = calendar.getTime();
// Builder๋ฅผ ์ฌ์ฉํ ๊ฐ์ฒด ์์ฑ
PersistenceLogins login = PersistenceLogins.builder()
.id(UUID.randomUUID().toString())
.username(username)
.token(UUID.randomUUID().toString())
.expiryDate(expiryDate)
.build();
try {
login = persistenceLoginsDAO.insertKey(login);
} catch (Exception e) {
e.printStackTrace();
}
return login;
}
@Override
public PersistenceLogins select(String username) {
PersistenceLogins login = null;
Map<String, Object> map = new HashMap<>();
map.put("username", username);
try {
login = persistenceLoginsDAO.selectBy(map);
} catch (Exception e) {
e.printStackTrace();
}
return login;
}
@Override
public PersistenceLogins selectByToken(String token) {
PersistenceLogins login = null;
Map<String, Object> map = new HashMap<>();
map.put("token", token);
try {
login = persistenceLoginsDAO.selectBy(map);
} catch (Exception e) {
e.printStackTrace();
}
return login;
}
@Override
public PersistenceLogins update(String username) {
// ํ์ฌ ์๊ฐ + 7์ผ ํ ๊ณ์ฐ
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DAY_OF_YEAR, 7);
Date expiryDate = calendar.getTime();
PersistenceLogins login = PersistenceLogins.builder()
.id(UUID.randomUUID().toString())
.username(username)
.expiryDate(expiryDate)
.updatedAt(new Date())
.build();
Map<String, Object> map = new HashMap<String, Object>();
map.put("username", username);
PersistenceLogins origin = null;
int result = 0;
try {
origin = persistenceLoginsDAO.selectBy(map);
login.setNo(origin.getNo());
login.setToken(origin.getToken());
result = persistenceLoginsDAO.update(login);
System.out.println("ํ ํฐ ์์ ์ฌ๋ถ : " + result);
} catch (Exception e) {
e.printStackTrace();
}
return login;
}
@Override
public PersistenceLogins refresh(String username) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("username", username);
PersistenceLogins origin = null;
PersistenceLogins refresh = null;
try {
origin = persistenceLoginsDAO.selectBy(map);
} catch (Exception e) {
e.printStackTrace();
}
// ํ ํฐ์ด ์๋ ๊ฒฝ์ฐ, ์์ฑ
if( origin == null ) {
refresh = insert(username);
}
// ํ ํฐ์ด ์๋ ๊ฒฝ์ฐ, ๊ฐฑ์
else {
refresh = update(username);
}
return refresh;
}
@Override
public boolean isValid(String token) {
PersistenceLogins login = selectByToken(token);
if (login == null) return false;
Date expiryDate = login.getExpiryDate();
Date now = new Date();
return expiryDate.after(now); // ํ์ฌ ์๊ฐ๋ณด๋ค ๋ง๋ฃ์ผ์ด ๋์ค์ด๋ฉด ์ ํจ
}
@Override
public boolean delete(String username) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("username", username);
int result = 0;
try {
result = persistenceLoginsDAO.deleteBy(map);
} catch (Exception e) {
e.printStackTrace();
}
return result > 0;
}
}
Java
๋ณต์ฌ
LoginServlet.java
โข
์ฃผ์ ์ฝ๋
// ์๋ ๋ก๊ทธ์ธ ---------------------------------------------------
String rememberMe = request.getParameter("rememberMe");
Cookie cookieRememberMe = new Cookie("rememberMe", "");
Cookie cookieToken = new Cookie("token", "");
// ์ฟ ํค ์ค์
cookieRememberMe.setPath("/");
cookieToken.setPath("/");
// ์ฟ ํค ๋ง๋ฃ์๊ฐ ์ค์ - 7์ผ (/์ด)
cookieRememberMe.setMaxAge(60*60*24*7);
cookieToken.setMaxAge(60*60*24*7);
// ์๋ ๋ก๊ทธ์ธ ์ฒดํฌ ์ฌ๋ถ
if( rememberMe != null && rememberMe.equals("on") ) {
// ์๋ ๋ก๊ทธ์ธ ์ฒดํฌ ์
// - ํ ํฐ ๋ฐํ
PersistenceLoginsService persistenceLoginsService = new PersistenceLoginsServiceImpl();
PersistenceLogins persistenceLogins = persistenceLoginsService.refresh(username);
String token = null;
if( persistenceLogins != null ) {
token = persistenceLogins.getToken();
}
// - ์ฟ ํค ์์ฑ
cookieRememberMe.setValue( URLEncoder.encode(rememberMe, "UTF-8") );
cookieToken.setValue( URLEncoder.encode(token, "UTF-8") );
}
else {
// ์๋ ๋ก๊ทธ์ธ ๋ฏธ์ฒดํฌ ์
// ์ฟ ํค ์ญ์
cookieRememberMe.setMaxAge(0);
cookieToken.setMaxAge(0);
}
response.addCookie(cookieRememberMe);
response.addCookie(cookieToken);
// ์๋ ๋ก๊ทธ์ธ ๋ ---------------------------------------------------
Java
๋ณต์ฌ
โข
์ ์ฒด ์ฝ๋
package board.servlet;
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import board.DTO.PersistenceLogins;
import board.DTO.Users;
import board.Service.PersistenceLoginsService;
import board.Service.PersistenceLoginsServiceImpl;
import board.Service.UserService;
import board.Service.UserServiceImpl;
import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
@WebServlet({"/login", "/login.jsp"})
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private UserService userService = new UserServiceImpl();
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String page = "";
// ์์ด๋ ์ ์ฅ ์ฟ ํค ํ์ธ
System.out.println("์์ด๋ ์ ์ฅ ์ฟ ํค ํ์ธ ...");
String rememberId = "";
String username = "";
Cookie[] cookies = request.getCookies();
if( cookies != null ) {
for( Cookie cookie : cookies ) {
String cookieName = cookie.getName();
String cookieValue = URLDecoder.decode( cookie.getValue(), "UTF-8" );
switch(cookieName) {
case "username" : username = cookieValue; break;
case "rememberId" : rememberId = cookieValue; break;
}
}
}
request.setAttribute("username", username);
request.setAttribute("rememberId", rememberId);
page = "/page/login.jsp";
RequestDispatcher dispatcher = request.getRequestDispatcher(page);
dispatcher.forward(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String root = request.getContextPath();
String path = request.getPathInfo();
// /login - ๋ก๊ทธ์ธ
String username = request.getParameter("username");
String password = request.getParameter("password");
// ์์ด๋ ์ ์ฅ ---------------------------------------------------
String rememberId = request.getParameter("rememberId");
Cookie cookieRememberId = new Cookie("rememberId", "");
Cookie cookieUsername = new Cookie("username", "");
cookieRememberId.setPath("/");
cookieUsername.setPath("/");
System.out.println("rememberId : " + rememberId);
// ์์ด๋ ์ ์ฅ ์ฒดํฌ ์ - ๊ฐ : on
if( rememberId != null && rememberId.equals("on") ) {
// ์ฟ ํค ์์ฑ
cookieRememberId.setValue( URLEncoder.encode(rememberId, "UTF-8") );
cookieUsername.setValue( URLEncoder.encode(username, "UTF-8") );
// ์ฟ ํค ๋ง๋ฃ์๊ฐ ์ค์ - 7์ผ (/์ด)
cookieRememberId.setMaxAge(60*60*24*7);
cookieUsername.setMaxAge(60*60*24*7);
}
// ์์ด๋ ์ ์ฅ ์ฒดํฌ ํด์ ์
else {
// ์ฟ ํค ์ญ์ - ์ฟ ํค ์ ํจ์๊ฐ์ 0์ผ๋ก ํ๊ณ ์๋ต
cookieRememberId.setMaxAge(0);
cookieUsername.setMaxAge(0);
}
// ์๋ต์ ์ฟ ํค ๋ฑ๋ก
response.addCookie(cookieRememberId);
response.addCookie(cookieUsername);
// ์์ด๋ ์ ์ฅ ๋ ---------------------------------------------------
// ์๋ ๋ก๊ทธ์ธ ---------------------------------------------------
String rememberMe = request.getParameter("rememberMe");
Cookie cookieRememberMe = new Cookie("rememberMe", "");
Cookie cookieToken = new Cookie("token", "");
// ์ฟ ํค ์ค์
cookieRememberMe.setPath("/");
cookieToken.setPath("/");
// ์ฟ ํค ๋ง๋ฃ์๊ฐ ์ค์ - 7์ผ (/์ด)
cookieRememberMe.setMaxAge(60*60*24*7);
cookieToken.setMaxAge(60*60*24*7);
// ์๋ ๋ก๊ทธ์ธ ์ฒดํฌ ์ฌ๋ถ
if( rememberMe != null && rememberMe.equals("on") ) {
// ์๋ ๋ก๊ทธ์ธ ์ฒดํฌ ์
// - ํ ํฐ ๋ฐํ
PersistenceLoginsService persistenceLoginsService = new PersistenceLoginsServiceImpl();
PersistenceLogins persistenceLogins = persistenceLoginsService.refresh(username);
String token = null;
if( persistenceLogins != null ) {
token = persistenceLogins.getToken();
}
// - ์ฟ ํค ์์ฑ
cookieRememberMe.setValue( URLEncoder.encode(rememberMe, "UTF-8") );
cookieToken.setValue( URLEncoder.encode(token, "UTF-8") );
}
else {
// ์๋ ๋ก๊ทธ์ธ ๋ฏธ์ฒดํฌ ์
// ์ฟ ํค ์ญ์
cookieRememberMe.setMaxAge(0);
cookieToken.setMaxAge(0);
}
response.addCookie(cookieRememberMe);
response.addCookie(cookieToken);
// ์๋ ๋ก๊ทธ์ธ ๋ ---------------------------------------------------
Users user = Users.builder()
.username(username)
.password(password)
.build();
boolean result = userService.login(user);
// ๋ก๊ทธ์ธ ์ฑ๊ณต
if( result ) {
// ํ์ ์กฐํ
Users loginUser = userService.selectByUsername(username);
loginUser.setPassword(null);
// ์ธ์
์ ์ฌ์ฉ์ ์ ๋ณด ๋ฑ๋ก
HttpSession session = request.getSession();
session.setAttribute("loginId", user.getUsername());
session.setAttribute("loginUser", loginUser);
response.sendRedirect(root + "/");
}
// ๋ก๊ทธ์ธ ์คํจ
else {
response.sendRedirect(root + "/login.jsp?error=true");
}
// [๋ก๊ทธ์ธ ๋] ##############################################################
}
}
Java
๋ณต์ฌ
LoginFilter.java
package board.filter;
import java.io.IOException;
import java.net.URLDecoder;
import board.DTO.PersistenceLogins;
import board.DTO.Users;
import board.Service.PersistenceLoginsService;
import board.Service.PersistenceLoginsServiceImpl;
import board.Service.UserService;
import board.Service.UserServiceImpl;
import jakarta.servlet.Filter;
import jakarta.servlet.FilterChain;
import jakarta.servlet.FilterConfig;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpFilter;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
@WebFilter(description = "์๋ ๋ก๊ทธ์ธ ๋ฑ, ์ธ์ฆ ์ฒ๋ฆฌ ํํฐ", urlPatterns = { "/*" })
public class LoginFilter extends HttpFilter implements Filter {
private static final long serialVersionUID = 6470731114379833406L;
PersistenceLoginsService persistenceLoginsService;
UserService userService;
public LoginFilter() {
super();
}
public void init(FilterConfig fConfig) throws ServletException {
persistenceLoginsService = new PersistenceLoginsServiceImpl();
userService = new UserServiceImpl();
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// ์ฟ ํค ํ์ธ
// 1. ์๋ ๋ก๊ทธ์ธ ์ฌ๋ถ
// 2. ์ธ์ฆ ํ ํฐ
HttpServletRequest httpRequest = (HttpServletRequest) request;
Cookie[] cookies = httpRequest.getCookies();
String rememberMe = null; // ์๋ ๋ก๊ทธ์ด ์ฌ๋ถ
String token = null; // ์ธ์ฆ ํ ํฐ
if( cookies != null ) {
for (Cookie cookie : cookies) {
String cookieName = cookie.getName();
String cookieValue = URLDecoder.decode( cookie.getValue(), "UTF-8") ;
switch (cookieName) {
case "rememberMe" : rememberMe = cookieValue; break;
case "token" : token = cookieValue; break;
}
}
}
System.out.println("LoginFilter...");
System.out.println("rememberMe : " + rememberMe);
System.out.println("token : " + token);
// ๋ก๊ทธ์ธ ์ฌ๋ถ ํ์ธ
HttpSession session = httpRequest.getSession();
String loginId = (String) session.getAttribute("loginId");
Users loginUser = (Users) session.getAttribute("loginUser");
// ์ด๋ฏธ ๋ก๊ทธ์ธ ๋จ
if( loginId != null && loginUser != null ) {
chain.doFilter(request, response);
System.out.println("๋ก๊ทธ์ธ๋ ์ฌ์ฉ์ : " + loginId);
return;
}
// ์๋ ๋ก๊ทธ์ธ & ํ ํฐ ok
if( rememberMe != null && token != null ) {
System.out.println("rememberMe : " + rememberMe);
System.out.println("token : " + token);
PersistenceLogins persistenceLogins = persistenceLoginsService.selectByToken(token);
System.out.println("persistenceLogins : " + persistenceLogins);
boolean isValid = persistenceLoginsService.isValid(token);
// ํ ํฐ์ด ์กด์ฌ, ์ ํจ
if( persistenceLogins != null && isValid ) {
loginId = persistenceLogins.getUsername();
loginUser = userService.selectByUsername(loginId);
System.out.println("loginId : " + loginId);
System.out.println("loginUser : " + loginUser);
// ๋ก๊ทธ์ธ ์ฒ๋ฆฌ
session.setAttribute("loginId", loginId);
session.setAttribute("loginUser", loginUser);
System.out.println("์๋ ๋ก๊ทธ์ธ ์ฑ๊ณต : " + loginUser);
}
}
chain.doFilter(request, response);
}
public void destroy() {
}
}
Java
๋ณต์ฌ



