【问题标题】:infinite loop while accessing resource folder访问资源文件夹时无限循环
【发布时间】:2017-08-15 05:08:33
【问题描述】:

在我的 spring 项目中,我编写了一个过滤器来处理所有请求。它工作正常,但是在访问资源时发生了无限循环。

我在扩展 WebMvcConfigurerAdapter 的类下定义了我的资源文件夹 这是我用来定义资源文件夹的代码:-

这是我的请求网址:

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
}
http://localhost:8080/abc/resources/images/chart/receivableaccounts.png

通过浏览器访问此 url 时,请求在控制台(eclipse)中进行了多次。

我无法确定真正的问题是什么。

这是我的请求过滤器:

package org.abc.app.config;

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;

import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.businesscognizance.app.util.Session;

/**
* <b>Custom filter created for handling all incoming,outgoing 
requests</b>
* 
* @author Jishnu
* 
*/

public class RequestFilter implements Filter {

private static Logger logger = 
LogManager.getLogger(RequestFilter.class);

@Override
public void init(FilterConfig filterConfig) throws ServletException {

}

@Override
public void doFilter(ServletRequest request, ServletResponse response, 
FilterChain chain)
        throws IOException, ServletException {
    HttpServletResponse httpServletResponse = (HttpServletResponse) response;
    HttpServletRequest httpServletRequest = (HttpServletRequest) request;
    String context = httpServletRequest.getContextPath();
    String requestUri = httpServletRequest.getRequestURI();
    int status = httpServletResponse.getStatus();
    System.out.println("hey there>>>>" + requestUri + "check this" + context + "/resources");
    if (isAuthenticated(httpServletRequest) || requestUri.equals(context + "/login")
            || requestUri.startsWith(context + "/resources")) {

        logger.info("access granted for a device with ip address" + " '" + httpServletRequest.getRemoteAddr() + "' "
                + "for requested url" + " '" + httpServletRequest.getRequestURL() + "'");

        if (isAuthorized()) {

        } else {
            httpServletResponse.reset();
            httpServletResponse.setStatus(HttpServletResponse.SC_FORBIDDEN);
            return;

        }
        chain.doFilter(request, response);

    }

    else {
        httpServletResponse.reset();
        if (status == HttpServletResponse.SC_ACCEPTED || status == HttpServletResponse.SC_OK) {
            httpServletResponse.setStatus(HttpServletResponse.SC_BAD_REQUEST);
        } else {
            httpServletResponse.setStatus(status);
        }
        httpServletResponse.getWriter().println("server rejected your request");

        return;

    }

}

@Override
public void destroy() {

}

public boolean isAuthorized() {
    return true;
}

public boolean isAuthenticated(HttpServletRequest request) {
    String accessToken = request.getHeader("access_token");
    boolean result = false;
    if (accessToken != null) {
        if (Session.ifTokenExists(accessToken)) {
            result = true;
        }

    }

    return result;
}

}

如果您需要任何进一步的信息,请告诉我。

任何建议都会很有用。

谢谢

【问题讨论】:

  • 你在FilterChain有2次相同的类吗?
  • @mlecz 没有。这是我的项目中剩下的唯一过滤器类
  • 您是如何提出请求的?发布请求 URL。你怎么会有无限循环?
  • @AbhijitSarkar 通过浏览器中的 url 访问像这样localhost:8080/abc/resources/images/chart/…
  • 在你的问题中,评论不是提供额外信息的地方。还要清楚地说明你看到的行为——你看不到无限循环。

标签: java spring filter resources


【解决方案1】:

这似乎是一个 hokey 实现:

  1. 预先验证的请求。
  2. 请求静态资源。

这看起来直接出自 2003 年的代码库;我建议您从扩展OncePerRequestFilter 开始,并将过滤器设置为@Component。由于您的 isAuthorized 方法什么都不做,您可以通过覆盖 shouldNotFilter 方法直接绕过某些 URL 的过滤器。你读过HttpServletResponse 的Javadoc 吗?调用reset会重置状态码,所以这种代码没用status == HttpServletResponse.SC_ACCEPTED || status == HttpServletResponse.SC_OK

我知道这并没有解决所谓的无限循环问题,但是一旦你清理它,你可能不会遇到这样的问题。最后但并非最不重要的一点是,使用调试器帮助自己;你有代码,我们没有。

【讨论】:

  • 我转移到了 OncePerRequestFilter 但同样的问题存在
  • @jishnuradhakrishnan 我提出的其他建议怎么样?你自己做过什么调试?
猜你喜欢
  • 1970-01-01
  • 2015-01-03
  • 2021-03-24
  • 2017-09-09
  • 1970-01-01
  • 1970-01-01
  • 2013-04-24
  • 1970-01-01
相关资源
最近更新 更多