jpablog : login basic

This commit is contained in:
kim
2021-01-30 16:33:35 +09:00
parent 74c99eb2b4
commit fe6b1a679e
8 changed files with 86 additions and 16 deletions

View File

@@ -11,17 +11,29 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpSession;
@RestController @RestController
@RequiredArgsConstructor @RequiredArgsConstructor
@RequestMapping("/api") @RequestMapping("/api")
public class UserApiController { public class UserApiController {
private final UserService userService; private final UserService userService;
private final HttpSession session;
@PostMapping("/user") @PostMapping("/user")
public ResponseDto<Integer> save(@RequestBody User user) { public ResponseDto<Integer> save(@RequestBody User user) {
user.setRole(RoleType.USER); user.setRole(RoleType.USER);
int result = userService.회원가입(user); int result = userService.회원가입(user);
return new ResponseDto<>(result, HttpStatus.OK); return new ResponseDto<>(result, HttpStatus.OK.value());
}
@PostMapping("/user/login")
public ResponseDto<Integer> login(@RequestBody User user) {
User principal = userService.로그인(user);
if (principal != null) {
session.setAttribute("principal", principal);
}
return new ResponseDto<>(1, HttpStatus.OK.value());
} }
} }

View File

@@ -14,5 +14,6 @@ import org.springframework.http.HttpStatus;
public class ResponseDto<T> { public class ResponseDto<T> {
T data; T data;
HttpStatus status; int statusCode;
} }

View File

@@ -1,5 +1,7 @@
package com.example.jpablog.handler; package com.example.jpablog.handler;
import com.example.jpablog.dto.ResponseDto;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
@@ -9,7 +11,7 @@ import org.springframework.web.bind.annotation.RestController;
public class GlobalExceptionHandler { public class GlobalExceptionHandler {
@ExceptionHandler(value = Exception.class) @ExceptionHandler(value = Exception.class)
public String handleArgumentException(Exception e) { public ResponseDto<String> handleArgumentException(Exception e) {
return "<h1>" + e.getMessage() + "</h1>"; return new ResponseDto<>(e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR.value());
} }
} }

View File

@@ -2,8 +2,15 @@ package com.example.jpablog.repository;
import com.example.jpablog.model.User; import com.example.jpablog.model.User;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
@Repository @Repository // 생략가능
public interface UserRepository extends JpaRepository<User, Long> { public interface UserRepository extends JpaRepository<User, Long> {
// select * from user where username =? and password =?;
User findByUsernameAndPassword(String username, String password);
// @Query(value = "select * from user where username=?1 and password=?2", nativeQuery = true)
// User login(String username, String password);
} }

View File

@@ -6,9 +6,11 @@ import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.util.Optional;
@Service @Service
@RequiredArgsConstructor @RequiredArgsConstructor
@Transactional(readOnly = true) @Transactional(readOnly = true) // select 할 때 트랜잭션 시작, 서비스 종료시에 트랜잭션 종료 (정합성)
public class UserService { public class UserService {
private final UserRepository userRepository; private final UserRepository userRepository;
@@ -18,4 +20,8 @@ public class UserService {
userRepository.save(user); userRepository.save(user);
return 1; return 1;
} }
public User 로그인(User user) {
return userRepository.findByUsernameAndPassword(user.getUsername(), user.getPassword());
}
} }

View File

@@ -2,6 +2,9 @@ let index = {
init : function () { init : function () {
$("#btn-save").on("click", () => { $("#btn-save").on("click", () => {
this.save(); this.save();
});
$("#btn-login").on("click", () => {
this.login();
}) })
}, },
save : function () { save : function () {
@@ -23,6 +26,23 @@ let index = {
}).fail(function (error){ }).fail(function (error){
alert(JSON.stringify(error)); alert(JSON.stringify(error));
}); });
},
login : function () {
let data = {
username: $("#username").val(),
password: $("#pwd").val(),
};
$.ajax({
type: "post",
url: "/jpablog/api/user/login",
data: JSON.stringify(data),
contentType: "application/json; charset=utf-8",
dataType: "json"
}).done(function (resp){
location.href = "/jpablog";
}).fail(function (error){
alert(JSON.stringify(error));
});
} }
} }

View File

@@ -1,4 +1,5 @@
<%@page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <%@page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@ taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en">
@@ -19,14 +20,34 @@
<span class="navbar-toggler-icon"></span> <span class="navbar-toggler-icon"></span>
</button> </button>
<div class="collapse navbar-collapse" id="collapsibleNavbar"> <div class="collapse navbar-collapse" id="collapsibleNavbar">
<ul class="navbar-nav"> <c:choose>
<li class="nav-item"> <c:when test="${empty sessionScope.principal}">
<a class="nav-link" href="${pageContext.request.contextPath}/user/loginForm">로그인</a> <ul class="navbar-nav">
</li> <li class="nav-item">
<li class="nav-item"> <a class="nav-link" href="${pageContext.request.contextPath}/user/loginForm">로그인</a>
<a class="nav-link" href="${pageContext.request.contextPath}/user/joinForm">회원가입</a> </li>
</li> <li class="nav-item">
</ul> <a class="nav-link" href="${pageContext.request.contextPath}/user/joinForm">회원가입</a>
</li>
</ul>
</c:when>
<c:otherwise>
<ul class="navbar-nav">
<li class="nav-item">
<a class="nav-link" href="${pageContext.request.contextPath}/user/writeForm">글쓰기</a>
</li>
<li class="nav-item">
<a class="nav-link" href="${pageContext.request.contextPath}/user/userForm">회원정보</a>
</li>
<li class="nav-item">
<a class="nav-link" href="${pageContext.request.contextPath}/user/logout">로그아웃</a>
</li>
</ul>
</c:otherwise>
</c:choose>
</div> </div>
</nav> </nav>
<br/> <br/>

View File

@@ -3,7 +3,7 @@
<%@include file="../layout/header.jsp"%> <%@include file="../layout/header.jsp"%>
<div class="container"> <div class="container">
<form action="/action_page.php"> <form>
<div class="form-group"> <div class="form-group">
<label for="username">Username:</label> <label for="username">Username:</label>
<input type="text" class="form-control" placeholder="Enter username" id="username"> <input type="text" class="form-control" placeholder="Enter username" id="username">
@@ -17,8 +17,9 @@
<input class="form-check-input" type="checkbox"> Remember me <input class="form-check-input" type="checkbox"> Remember me
</label> </label>
</div> </div>
<button type="submit" class="btn btn-primary">로그인</button> <button id="btn-login" type="button" class="btn btn-primary">로그인</button>
</form> </form>
</div> </div>
<script src="${pageContext.request.contextPath}/js/user.js"></script>
<%@include file="../layout/footer.jsp"%> <%@include file="../layout/footer.jsp"%>