강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

skyve21님의 프로필 이미지
skyve21

작성한 질문수

스프링과 JPA 기반 웹 애플리케이션 개발

회원 가입 인증 메일 확인

마지막 이메일 확인 페이지가 안뜹니다

작성

·

206

0

controll 테스트부분에서 notnull에 emailchecktoken에 문제가 없고 가입까지 하고난뒤 check-email-token 값을 복사하여 실행하면 빈화면이 뜹니다 그냥 흰화면만 나오고 f12눌러서 확인하면 <plaintext 문서의 문자 인코딩이 선언되어 있지 않습니다.문서에 US ASCII 외의 문자가 포함되어 있는 경우, 브라우저의 설정에 따라서 글자가 깨질 수 있습니다. 파일 문자 인코딩은 전송 프로토콜로 선언되어 문자 인코딩을 지정하는 바이트 오더 마크가 파일에 사용되어야 합니다.> 이런 오류메시지만 나옵니다. 방법을 찾아보려고 검색도 해봤는데 해결이 안되네요

 

일단 checked-email

 

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>StudyOlle</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<style>
.container{
max-width: 100%;
}
</style>
</head>
<body class="bg-light">
<nav class="navbar navbar-expand-sm navbar-dark bg-dark">
<a class="navbar-brand" href="/" th:href="@{/}">
<img src="/images/logo_sm.png" width="30" height="30">
</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>

<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav mr-auto">
<li class="nav-item">
<form th:action="@{/search/study}" class="form-inline" method="get">
<input class="form-control mr-sm-2" name="keyword" type="search" placeholder="스터디 찾기" aria-label="Search" />
</form>
</li>
</ul>

<ul class="navbar-nav justify-content-end">
<li class="nav-item">
<a class="nav-link" href="#" th:href="@{/login}">로그인</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#" th:href="@{/sign-up}">가입</a>
</li>
</ul>>
</div>
</nav>

<div class="py-5 text-center" th:if="${error}">
<p class="lead">스터디올래 이메일 확인</p>
<div class="alert alert-danger" role="alert">
이메일 확인 링크가 정확하지 않습니다.
</div>
</div>

<div class="py-5 text-center" th:if="${error == null}">
<p class="lead">스터디올래 이메일 확인</p>
<h2>
이메일을 확인했습니다. <span th:text="${numberOfUser}">10</span>번째 회원,
<span th:text="${nickname}">백기선</span>님 가입을 축하합니다.
</h2>
<small class="text-info">이제부터 가입할 때 사용한 이메일 또는 닉네임과 패스트워드로 로그인 할 수 있습니다.</small>
</div>
</body>
</html>

 

controller

 

@Controller
@RequiredArgsConstructor
public class AccountController {

private final AccountRepository accountRepository;
private final SignUpFormValidator signUpFormValidator;
private final AccountService accountService;

@InitBinder("signUpForm")
public void initBinder(WebDataBinder webDataBinder) {
webDataBinder.addValidators(signUpFormValidator);

}

@GetMapping("/sign-up")
public String signUpForm(Model model) {
model.addAttribute(new SignUpForm());
return "account/sign-up";
}

@PostMapping("/sign-up")
public String signUpSubmit(@Valid SignUpForm signUpForm, Errors errors) {
if (errors.hasErrors()) {
return "account/sign-up";
}
accountService.processNewAccount(signUpForm);
//TODO 회원 가입 처리
return "redirect:/";
}

@GetMapping("/check-email-token")
public String checkEmailToken(String token, String email, Model model) {
Account account = accountRepository.findByEmail(email);
String view = "account/checked-email";
if (account == null) {
model.addAttribute("error", "wrong.email");
return view;
}
if (!account.getEmailCheckToken().equals(token)) {
model.addAttribute("error", "wrong.token");
return view;
}
account.setEmailVerified(true);
account.setJoinedAt(LocalDateTime.now());
model.addAttribute("numberOfUser", accountRepository.count());
model.addAttribute("nickname", account.getNickname());
return view;
}
}

 

service

 

@Service
@RequiredArgsConstructor
public class AccountService {

private final AccountRepository accountRepository;
private final JavaMailSender javaMailSender;
private final PasswordEncoder passwordEncoder;

@Transactional
public void processNewAccount(SignUpForm signUpForm) {
Account newAccount = saveNewAccount(signUpForm);
newAccount.generateEmailCheckToken();
sendSignUpConfirmEmail(newAccount);
}

private Account saveNewAccount(@Valid SignUpForm signUpForm) {
Account account = Account.builder()
.email(signUpForm.getEmail())
.nickname(signUpForm.getNickname())
.password(passwordEncoder.encode(signUpForm.getPassword())) //인코딩해야됨됨
.studyCrateByWeb(true)
.studyEnrollmentByWeb(true)
.studyUpdateByWeb(true)
.build();
return accountRepository.save(account);
}

private void sendSignUpConfirmEmail(Account newAccount) {
SimpleMailMessage mailMessage = new SimpleMailMessage();
mailMessage.setTo(newAccount.getEmail());
mailMessage.setSubject("스터디 올래, 회원 가입 인증");
mailMessage.setText("/check-email-token?token="+ newAccount.getEmailCheckToken()
+"&email="+ newAccount.getEmail());
javaMailSender.send(mailMessage);
}

}
입니다

어디가 문제일까요?

실행화면

 

git junepro/studyolle1 입니다

퀴즈

회원 가입 시 이메일 인증 절차를 사용하는 가장 중요한 이유가 무엇일까요?

계정 도메인 모델의 복잡성 증가를 위해서

실제 사용자인지 확인하고 스팸 가입을 방지하기 위해

패스워드 인코딩 과정을 간소화하기 위해

프론트엔드 라이브러리 설정을 쉽게 하기 위해

답변 1

0

백기선님의 프로필 이미지
백기선
지식공유자

올려두신 코드를 봤으니 checked-email 뷰 템플릿 코드가 누락되어있습니다. 해당 에러가 재현되는 상태로 코드를 올려주시면 다시 살펴보겠습니다.

 

skyve21님의 프로필 이미지
skyve21
질문자

안녕하세요 부트버전이 안맞아서 오류난거같습니다 최신부트로 해서 강의랑 달라서 그런거같습니다. 해결됐습니다 답변감사드립니다 ~!

백기선님의 프로필 이미지
백기선
지식공유자

네 다행이네요.

skyve21님의 프로필 이미지
skyve21

작성한 질문수

질문하기