• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

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

21.12.08 23:07 작성 조회수 128

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

질문자

2021.12.09

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

네 다행이네요.