

public String save(User user, Model model) throw Exception {
Strign msg = URLEncoder.encode("id 틀림",utf-8);
model.addAttribute("msg",msg)
return "redirect:/register/add";
}



public final void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws ServletException, IOException {
if (request instanceof HttpServletRequest httpRequest) {
if (response instanceof HttpServletResponse httpResponse) {
String alreadyFilteredAttributeName = this.getAlreadyFilteredAttributeName();
boolean hasAlreadyFilteredAttribute = request.getAttribute(alreadyFilteredAttributeName) != null;
if (!this.skipDispatch(httpRequest) && !this.shouldNotFilter(httpRequest)) {
if (hasAlreadyFilteredAttribute) {
if (DispatcherType.ERROR.equals(request.getDispatcherType())) {
this.doFilterNestedErrorDispatch(httpRequest, httpResponse, filterChain);
return;
}
filterChain.doFilter(request, response);
} else {
request.setAttribute(alreadyFilteredAttributeName, Boolean.TRUE);
try {
this.doFilterInternal(httpRequest, httpResponse, filterChain);
} finally {
request.removeAttribute(alreadyFilteredAttributeName);
}
}
} else {
filterChain.doFilter(request, response);
}
return;
}
}

1. hasAlreadyFilteredAttribute가 맨처음 false라는것은 처음들어왔다는 뜻이기때문에
2. 밑의 else 구문으로 빠지게되고 true로 바꿔준다

3. 그 다음 만약 동일한 doFilter요청이 들어왔을때 boolena값을 보고 true라면
이미 실행이 됐었다는 뜻이기때문에 동일한 객체라고 인식하고 그다음 doFiletInternal() 메서드를 호출한다