service
메소드에 넘겨주고 그 결과를 응답으로 전달한다.init
과 destroy
메소드로 생명주기를 담당한다.Thread Per Request 모델이란?
public interface Servlet {
public void init(ServletConfig config)
throws ServletException;
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException;
public void destroy();
}
init
: Servlet을 초기화할 때 사용. Servlet 객체를 생성할 때 사용되며 이후 ServletContainer
에 등록service
: 클라이언트의 요청에 따라서 비즈니스 로직을 실행하고 응답 반환destroy
: Servlet 종료시 수행. 리소스 해제 등 을 맡는다public abstract class HttpServlet extends GenericServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) {...}
protected void doHead(HttpServletRequest req, HttpServletResponse resp) {...}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) {...}
protected void doPut(HttpServletRequest req, HttpServletResponse resp) {...}
protected void doDelete(HttpServletRequest req, HttpServletResponse resp) {...}
protected void doOptions(HttpServletRequest req, HttpServletResponse resp) {...}
protected void doTrace(HttpServletRequest req, HttpServletResponse resp) {...}
}
protected void service(HttpServletRequest req, HttpServletResponse resp) {
String method = req.getMethod();
if (method.equals(METHOD_GET)) {
...
doGet(req, resp);
} else if (method.equals(METHOD_HEAD)) {
...
doHead(req, resp);
} else if (method.equals(METHOD_POST)) {
doPost(req, resp);
} else if (method.equals(METHOD_PUT)) {
doPut(req, resp);
} else if (method.equals(METHOD_DELETE)) {
doDelete(req, resp);
} else if (method.equals(METHOD_OPTIONS)) {
doOptions(req, resp);
} else if (method.equals(METHOD_TRACE)) {
doTrace(req, resp);
}
}
public class DispatcherServlet extends FrameworkServlet {
@Override
protected void doService(HttpServletRequest request,
HttpServletResponse response) {
...
doDispatch(request, response);
}
}
public class CustomAuthenticationFilter extends AbstractAuthenticationProcessingFilter {
public CustomAuthenticationFilter(String defaultFilterProcessesUrl) {
super(defaultFilterProcessesUrl);
}
@Override
public Authentication attemptAuthentication(
HttpServletRequest request, HttpServletResponse response)
throws AuthenticationException {
String username = request.getParameter("username");
String password = request.getParameter("password");
UsernamePasswordAuthenticationToken authRequest =
new UsernamePasswordAuthenticationToken(username, password);
return getAuthenticationManager().authenticate(authRequest);
}
@Override
protected void successfulAuthentication(
HttpServletRequest request, HttpServletResponse response,
FilterChain chain, Authentication authResult) {
SecurityContextHolder.getContext().setAuthentication(authResult);
}
}
public class SecurityContextHolder {
...
private static void initializeStrategy() {
...
if (!StringUtils.hasText(strategyName)) {
// Set default
strategyName = MODE_THREADLOCAL;
}
...
// Try to load a custom strategy
try {
Class<?> clazz = Class.forName(strategyName);
Constructor<?> customStrategy = clazz.getConstructor();
strategy = (SecurityContextHolderStrategy) customStrategy.newInstance();
}
}
public static SecurityContext getContext() {
return strategy.getContext();
}
}