Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 2dfb9bf

Browse files
Forgot password - 1
1 parent e6097e4 commit 2dfb9bf

File tree

10 files changed

+165
-1
lines changed

10 files changed

+165
-1
lines changed
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.naturalprogrammer.spring5tutorial.commands;
2+
3+
import com.naturalprogrammer.spring5tutorial.validation.EmailExists;
4+
5+
public class ForgotPasswordCommand {
6+
7+
@EmailExists
8+
private String email;
9+
10+
public String getEmail() {
11+
return email;
12+
}
13+
public void setEmail(String email) {
14+
this.email = email;
15+
}
16+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package com.naturalprogrammer.spring5tutorial.controllers;
2+
3+
import org.apache.commons.logging.Log;
4+
import org.apache.commons.logging.LogFactory;
5+
import org.springframework.stereotype.Controller;
6+
import org.springframework.ui.Model;
7+
import org.springframework.validation.BindingResult;
8+
import org.springframework.validation.annotation.Validated;
9+
import org.springframework.web.bind.annotation.GetMapping;
10+
import org.springframework.web.bind.annotation.PostMapping;
11+
import org.springframework.web.bind.annotation.RequestMapping;
12+
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
13+
14+
import com.naturalprogrammer.spring5tutorial.commands.ForgotPasswordCommand;
15+
import com.naturalprogrammer.spring5tutorial.services.UserService;
16+
import com.naturalprogrammer.spring5tutorial.utils.MyUtils;
17+
18+
@Controller
19+
@RequestMapping("/forgot-password")
20+
public class ForgotPasswordController {
21+
22+
private static Log log = LogFactory.getLog(ForgotPasswordController.class);
23+
24+
private UserService userService;
25+
26+
public ForgotPasswordController(UserService userService) {
27+
28+
this.userService = userService;
29+
}
30+
31+
@GetMapping
32+
public String forgotPassword(Model model) {
33+
34+
model.addAttribute(new ForgotPasswordCommand());
35+
return "forgot-password";
36+
}
37+
38+
@PostMapping
39+
public String doForgotPassword(
40+
@Validated ForgotPasswordCommand forgotPasswordCommand,
41+
BindingResult result,
42+
RedirectAttributes redirectAttributes) {
43+
44+
if (result.hasErrors())
45+
return "forgot-password";
46+
47+
userService.forgotPassword(forgotPasswordCommand);
48+
MyUtils.flash(redirectAttributes, "success", "forgotPasswordMailSent");
49+
return "redirect:/";
50+
}
51+
}

‎src/main/java/com/naturalprogrammer/spring5tutorial/services/UserService.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import org.springframework.boot.context.event.ApplicationReadyEvent;
66

7+
import com.naturalprogrammer.spring5tutorial.commands.ForgotPasswordCommand;
78
import com.naturalprogrammer.spring5tutorial.commands.UserCommand;
89
import com.naturalprogrammer.spring5tutorial.domain.User;
910

@@ -13,4 +14,5 @@ public interface UserService {
1314
void afterApplicationReady(ApplicationReadyEvent event);
1415
void verify(String verificationCode);
1516
void resendVerificationMail(User user) throws MessagingException;
17+
void forgotPassword(ForgotPasswordCommand forgotPasswordCommand);
1618
}

‎src/main/java/com/naturalprogrammer/spring5tutorial/services/UserServiceImpl.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import org.springframework.transaction.annotation.Propagation;
1717
import org.springframework.transaction.annotation.Transactional;
1818

19+
import com.naturalprogrammer.spring5tutorial.commands.ForgotPasswordCommand;
1920
import com.naturalprogrammer.spring5tutorial.commands.UserCommand;
2021
import com.naturalprogrammer.spring5tutorial.domain.User;
2122
import com.naturalprogrammer.spring5tutorial.domain.User.Role;
@@ -158,4 +159,9 @@ private boolean isAdminOrSelfLoggedIn(User user) {
158159

159160
return false;
160161
}
162+
163+
@Override
164+
public void forgotPassword(ForgotPasswordCommand forgotPasswordCommand) {
165+
log.info("Resetting password for " + forgotPasswordCommand.getEmail());
166+
}
161167
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.naturalprogrammer.spring5tutorial.validation;
2+
3+
import static java.lang.annotation.ElementType.FIELD;
4+
import static java.lang.annotation.RetentionPolicy.RUNTIME;
5+
6+
import java.lang.annotation.Documented;
7+
import java.lang.annotation.Retention;
8+
import java.lang.annotation.Target;
9+
10+
import javax.validation.Constraint;
11+
import javax.validation.constraints.Size;
12+
13+
import org.hibernate.validator.constraints.Email;
14+
import org.hibernate.validator.constraints.NotBlank;
15+
16+
@Constraint(validatedBy=EmailExistsValidator.class)
17+
@NotBlank(message="{blankEmail}")
18+
@Email
19+
@Size(min=4, max=250, message="{emailSizeError}")
20+
@Documented
21+
@Retention(RUNTIME)
22+
@Target(FIELD)
23+
public @interface EmailExists {
24+
25+
String message() default "{emailNotFound}";
26+
27+
Class[] groups() default {};
28+
29+
Class[] payload() default {};
30+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.naturalprogrammer.spring5tutorial.validation;
2+
3+
import javax.validation.ConstraintValidator;
4+
import javax.validation.ConstraintValidatorContext;
5+
6+
import org.springframework.stereotype.Component;
7+
8+
import com.naturalprogrammer.spring5tutorial.repositories.UserRepository;
9+
10+
@Component
11+
public class EmailExistsValidator
12+
implements ConstraintValidator<EmailExists, String> {
13+
14+
private UserRepository userRepository;
15+
16+
public EmailExistsValidator(UserRepository userRepository) {
17+
this.userRepository = userRepository;
18+
}
19+
20+
@Override
21+
public void initialize(EmailExists arg0) {
22+
// TODO Auto-generated method stub
23+
24+
}
25+
26+
@Override
27+
public boolean isValid(String email, ConstraintValidatorContext arg1) {
28+
29+
return userRepository.findByEmail(email).isPresent();
30+
}
31+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
11
blankEmail: Please provide your email address!
22
emailSizeError: Email size should be between {min} and {max} chars
33
duplicateEmail: Email should be unique
4+
5+
emailNotFound: Email address not found

‎src/main/resources/messages.properties

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,6 @@ wrongVerificationCode: The verification code doesn't match
1616
1717
verificationMailResent: Verification mail resent!
1818
userNotFound: User not found
19-
notPermitted: Not permitted
19+
notPermitted: Not permitted
20+
21+
forgotPasswordMailSent: Check your mail box for resetting password
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
2+
<%@include file="includes/header.jsp"%>
3+
4+
<div class="panel panel-primary">
5+
<div class="panel-heading">
6+
<h3 class="panel-title">Forgot password?</h3>
7+
</div>
8+
<div class="panel-body">
9+
<form:form modelAttribute="forgotPasswordCommand">
10+
11+
<form:errors cssClass="error"/>
12+
13+
<div class="form-group">
14+
<form:label path="email">Email address</form:label>
15+
<form:input path="email" type="email" class="form-control" id="exampleInputEmail1" placeholder="Email" />
16+
<form:errors path="email" cssClass="error" />
17+
</div>
18+
<button type="submit" class="btn btn-primary">Reset Password</button>
19+
</form:form>
20+
</div>
21+
</div>
22+
23+
<%@include file="includes/footer.jsp"%>

‎src/main/webapp/WEB-INF/jsp/login.jsp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
</div>
4242

4343
<button type="submit" class="btn btn-primary">Sign In</button>
44+
<a href="/forgot-password" class="btn btn-default">Forgot Password</a>
4445
</form:form>
4546
</div>
4647
</div>

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /