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



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

我试图简单地检查 url,如果它是一个资源,什么都不做,但拦截器之后没有找到资源,它仍然运行了这些方法,因为它们是用@ModelAttribute注释的。

全局控制器.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()。

如果你只想用 Spring 来做这件事,这是可能的,但有点混乱:

  1. 您需要使用 SimpleUrlHandlerMapping,为此,您可以可以显式指定应映射到的 URL 模式控制器或扩展它以支持"忽略"URL,如"css/**"。
  2. 您需要编写自己的 HttpRequestHandler 实现基本上包括"getServletContext().getRequestDsipatcher().include()" 调用按原样返回请求的资源。
  3. 您必须将该处理程序
  4. 注册为上述项的默认处理程序SimpleUrlHandlerMapping.

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

@SuppressWarnings("deprecation")
@Configuration
public class DefaultView extends WebMvcConfigurerAdapter {
    @SuppressWarnings("SpringMVCViewInspection")
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/files/**").setViewName("forward:/index.html");
        registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
        super.addViewControllers(registry);
    }
}

项目结构的屏幕截图

最新更新