package com.hwlcn.security.web.servlet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;
public abstract class OncePerRequestFilter extends NameableFilter {
private static final Logger log = LoggerFactory.getLogger(OncePerRequestFilter.class);
public static final String ALREADY_FILTERED_SUFFIX = ".FILTERED";
private boolean enabled = true;
public boolean isEnabled() {
return enabled;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
public final void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
String alreadyFilteredAttributeName = getAlreadyFilteredAttributeName();
if (request.getAttribute(alreadyFilteredAttributeName) != null) {
if (log.isTraceEnabled()) {
log.trace("Filter '{}' already executed. Proceeding without invoking this filter.", getName());
}
filterChain.doFilter(request, response);
} else if (!isEnabled(request, response)) {
if (log.isDebugEnabled()) {
log.debug("Filter '{}' is not enabled for the current request. Proceeding without invoking this filter.",
getName());
}
filterChain.doFilter(request, response);
} else {
if (log.isTraceEnabled()) {
log.trace("Filter '{}' not yet executed. Executing now.", getName());
}
request.setAttribute(alreadyFilteredAttributeName, Boolean.TRUE);
try {
doFilterInternal(request, response, filterChain);
} finally {
request.removeAttribute(alreadyFilteredAttributeName);
}
}
}
protected boolean isEnabled(ServletRequest request, ServletResponse response) throws ServletException, IOException {
return isEnabled();
}
protected String getAlreadyFilteredAttributeName() {
String name = getName();
if (name == null) {
name = getClass().getName();
}
return name + ALREADY_FILTERED_SUFFIX;
}
protected abstract void doFilterInternal(ServletRequest request, ServletResponse response, FilterChain chain)
throws ServletException, IOException;
}