Java Spring启动 - OnceRequestPerFilter仅允许控制器请求映射

时间:2018-06-07 02:56:17

标签: java spring spring-boot

我目前正在我的项目中实施审计跟踪,我尝试使用HandlerInterceptor,它似乎无法在我的项目中工作,所以我寻找另一种方式,我发现它可能{{1 }}

这是我的OncePerRequestFilter类的代码:

OncePerRequestFilter

到目前为止,我用@Component @Order public class LogFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { String method = request.getMethod(); String username = SecurityContextHolder.getContext().getAuthentication().getName(); String url = request.getRequestURL().toString(); // Log the info you need // ... filterChain.doFilter(request, response); } } 的当前配置看到的唯一问题是它还包括css / javascripts等资源。

示例这些链接也将转到过滤器:

http://localhost:8000/project/css/style.css

http://localhost:8000/project/3277a64fcca0dbde907d8684aed8f170.png

http://localhost:8000/project/js/script.js.map

我想要的是仅过滤控制器请求映射,并忽略资源 例如:

http://localhost:8000/project/accounts/client-users

http://localhost:8000/project/accounts

1 个答案:

答案 0 :(得分:0)

此代码是忽略资源文件的变通方法。不确定这是不是最好的做法。

@Component
@Order
public class LogFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(HttpServletRequest request,
        HttpServletResponse response, FilterChain filterChain)
        throws ServletException, IOException {
        String method = request.getMethod();
        String username = SecurityContextHolder.getContext().getAuthentication().getName();
        String url = request.getRequestURL().toString();

        filterChain.doFilter(request, response);
    }

    protected boolean shouldNotFilter(HttpServletRequest request)
        throws ServletException {
        String url = request.getRequestURL().toString();
        return isResourceUrl(url);
    }

    private boolean isResourceUrl(String url) {
        boolean isResourceUrl = false;
        List<String> resourceRequests = Arrays.asList(
            "/css/", "/js/", "/scss/", "/fonts/", "/emails/",
            ".css", ".js", ".scss", ".eot", ".svg", ".ttf", ".woff", ".otf", ".ico", ".png");
        for (String resourceRequest : resourceRequests) {
            if (url.contains(resourceRequest)) {
                isResourceUrl = true;
            }
        }
        return isResourceUrl;
    }
}
相关问题