如何从请求映射中排除静态资源

时间:2019-01-04 12:59:33

标签: spring spring-mvc controller

我正在尝试从@RequestMapping路径中排除静态资源,以避免对方法的多余调用。

我试图简单地检查url,如果它是无用的资源,但是拦截器在此之后找不到资源,并且它还是运行方法,因为它们使用@ModelAttribute进行了注释。

GlobalController.java

@RequestMapping(value = "/")
public class GlobalControllerAdvice {

    public static int k;

    @Autowired
    private UsersService usersService;

    @ModelAttribute("unread")
    public int unread(Principal principal) {

        int unread = 0;

        k++;
        System.err.println("Inside unread " + k);

        if (principal != null) {
            User user = usersService.getWithUser(principal.getName(), "notifications");
            for (Notification n : user.getNotifications())
                if (!n.isRead())
                    unread++;
        }

        return unread;
    }
}

资源处理程序

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/static/**").addResourceLocations("/resources/");
}

预期结果应排除所有包含“静态”的url,但现在不包含它,并且jsp页面中的每个图像和脚本都将调用unread()。

2 个答案:

答案 0 :(得分:0)

如果您只想使用Spring进行此操作,则可能会有点混乱:

  1. 您要么需要使用一个SimpleUrlHandlerMapping 可以明确指定应映射到的网址格式 控制器或对其进行扩展以支持“忽略” URL,例如“ css /**”。
  2. 您需要编写自己的HttpRequestHandler实现, 基本上包括 调用“ getServletContext()。getRequestDsipatcher()。include()” 按原样返回请求的资源。
  3. 您必须将上述处理程序注册为defaultHandler。 SimpleUrlHandlerMapping。

完成所有操作后,所有无法映射到控制器的请求都将转发到HttpRequestHandler并按原样提供。

答案 1 :(得分:0)

void formatDouble(char* buf, double val, int precMin, int precMax) {
    sprintf(buf, "%.*f", precMax, val);
    int startpos = 0;
    int length = strlen(buf);
    bool found = false;
    for (int z = 0; z < length; z++)
    {
        if (buf[z] == '.')
        {
            startpos = z;
            found = true;
            break;
        }
    }
    if (!found)
        return;
    int endIndex = startpos + precMin;
    found = false;
    for (int z = precMax + startpos; z >= startpos + precMin; z--)
    {
        if (buf[z] >= '1' && buf[z] <= '9')
        {
            endIndex = z;
            if (endIndex < startpos + precMax)
            {
                // Round Digit
                if (buf[z + 1] >= '5')
                    buf[z]++;
            }
            found = true;
            break;
        }
    }
    for (int z = endIndex + 1; z <= length; z++)
    {
        if (z <= startpos + precMax)
            buf[z] = 0;
    }
}

screenshot of project structure