我正在尝试从路径中排除静态资源@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 来做这件事,这是可能的,但有点混乱:
- 您需要使用 SimpleUrlHandlerMapping,为此,您可以可以显式指定应映射到的 URL 模式控制器或扩展它以支持"忽略"URL,如"css/**"。
- 您需要编写自己的 HttpRequestHandler 实现基本上包括"getServletContext().getRequestDsipatcher().include()" 调用按原样返回请求的资源。 您必须将该处理程序
- 注册为上述项的默认处理程序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);
}
}
项目结构的屏幕截图