留言板系統用戶認證模塊包含兩個核心頁面:
<%@ taglib prefix="c" uri="https://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="https://java.sun.com/jsp/jstl/fmt" %>
<form action="${pageContext.request.contextPath}/register.do" method="post">
<div class="form-group">
<label>用戶名</label>
<input type="text" name="username" value="${param.username}" required/>
<c:if test="${not empty errors.username}">
<span class="error">${errors.username}</span>
</c:if>
</div>
<div class="form-group">
<label>密碼</label>
<input type="password" name="password" required/>
</div>
<div class="form-group">
<label>確認密碼</label>
<input type="password" name="confirmPassword" required/>
</div>
<div class="form-group">
<label>郵箱</label>
<input type="email" name="email" value="${param.email}" required/>
</div>
<div class="form-group">
<label>驗證碼</label>
<input type="text" name="captcha" required/>
<img src="${pageContext.request.contextPath}/captcha.jpg" onclick="this.src=this.src+'?t='+Math.random()"/>
</div>
<button type="submit">註冊</button>
</form>
@Controller
public class AuthController {
@PostMapping("/register.do")
public String register(@Valid RegisterForm form, BindingResult result, HttpSession session) {
if (result.hasErrors()) return "register"; // 回顯錯誤
if (!captchaService.validate(form.getCaptcha(), session)) {
result.rejectValue("captcha", "error.captcha", "驗證碼錯誤");
return "register";
}
if (userService.existsByUsername(form.getUsername())) {
result.rejectValue("username", "error.exists", "用戶名已存在");
return "register";
}
userService.register(form.getUsername(), form.getPassword(), form.getEmail());
return "redirect:/login.jsp?registered=true";
}
@GetMapping("/logout.do")
public String logout(HttpSession session, HttpServletRequest request, HttpServletResponse response) {
session.invalidate(); // 銷毀 Session
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie c : cookies) {
c.setMaxAge(0);
c.setPath("/");
response.addCookie(c);
}
}
return "redirect:/index.jsp";
}
}
_csrf Token,Spring Security 自動校驗。