doFilter和doFilterInternal OncePerRequestFilter 顾名思义,它能够确保在一次请求中只通过一次filter,而不会重复执行,是由Spring提供的抽象类,重写该接口的dofilterinternal方法,用来记录每次请求ip mac sessionid和返回报文日志
最编程
2024-01-03 21:16:21
...
org.springframework.session.web.http;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
abstract class OncePerRequestFilter implements Filter {
public static final String ALREADY_FILTERED_SUFFIX = ".FILTERED";
private String alreadyFilteredAttributeName = this.getClass().getName().concat(".FILTERED");
OncePerRequestFilter() {
}
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">final</span> <span style="color: rgba(0, 0, 255, 1)">void</span> doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) <span style="color: rgba(0, 0, 255, 1)">throws</span><span style="color: rgba(0, 0, 0, 1)"> ServletException, IOException {
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (request <span style="color: rgba(0, 0, 255, 1)">instanceof</span> HttpServletRequest && response <span style="color: rgba(0, 0, 255, 1)">instanceof</span><span style="color: rgba(0, 0, 0, 1)"> HttpServletResponse) {
HttpServletRequest httpRequest </span>=<span style="color: rgba(0, 0, 0, 1)"> (HttpServletRequest)request;
HttpServletResponse httpResponse </span>=<span style="color: rgba(0, 0, 0, 1)"> (HttpServletResponse)response;
</span><span style="color: rgba(0, 0, 255, 1)">boolean</span> hasAlreadyFilteredAttribute = request.getAttribute(<span style="color: rgba(0, 0, 255, 1)">this</span>.alreadyFilteredAttributeName) != <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (hasAlreadyFilteredAttribute) {
filterChain.doFilter(request, response);
} </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
request.setAttribute(</span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.alreadyFilteredAttributeName, Boolean.TRUE);
</span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.doFilterInternal(httpRequest, httpResponse, filterChain);
} </span><span style="color: rgba(0, 0, 255, 1)">finally</span><span style="color: rgba(0, 0, 0, 1)"> {
request.removeAttribute(</span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.alreadyFilteredAttributeName);
}
}
} </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 0, 255, 1)">throw</span> <span style="color: rgba(0, 0, 255, 1)">new</span> ServletException("OncePerRequestFilter just supports HTTP requests"<span style="color: rgba(0, 0, 0, 1)">);
}
}
</span><span style="color: rgba(0, 0, 255, 1)">protected</span> <span style="color: rgba(0, 0, 255, 1)">abstract</span> <span style="color: rgba(0, 0, 255, 1)">void</span> doFilterInternal(HttpServletRequest var1, HttpServletResponse var2, FilterChain var3) <span style="color: rgba(0, 0, 255, 1)">throws</span><span style="color: rgba(0, 0, 0, 1)"> ServletException, IOException;
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> init(FilterConfig config) {
}
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> destroy() {
}
}
上一篇: 如何用Java实现位图转矢量图?
下一篇: (转)浅析当今视频文件的格式