spring session共享,注入Bean的方式如下,提供的方法只能指定要拦截的URL,但不能过滤指定URL。
@Bean
public FilterRegistrationBean sessionRepositoryFilter(SessionRepositoryFilter<?
extends ExpiringSession> sessionRepositoryFilter) {
FilterRegistrationBean bean = new FilterRegistrationBean();
bean.setFilter(sessionRepositoryFilter);
bean.addUrlPatterns("/api/*"); // 默认为/*
bean.setOrder(SessionRepositoryFilter.DEFAULT_ORDER);
return bean;
}
FilterRegistrationBean支持集合参数,即:setUrlPatterns(Collection<String> urlPatterns)
那可以换个思路,即先获取系统中所有的RequestMapping中的URL,然后在排除不需要的URL即可。
private List<String> getRequestMappingHandlerMapping() {
RequestMappingHandlerMapping mapping = applicationContext.getBean(RequestMappingHandlerMapping.class);
Map<RequestMappingInfo, HandlerMethod> handlerMethods = mapping.getHandlerMethods();
List<String> requestMappingUrls = new ArrayList<String>();
handlerMethods.forEach((x, y) -> x.getPatternsCondition().getPatterns().forEach(url -> {
if(!待排除URL集合.contains(url)) {
requestMappingUrls.add(url);
}
}));
return requestMappingUrls;
}
/**
* 调整后的内容
**/
@Bean
public FilterRegistrationBean sessionRepositoryFilter(SessionRepositoryFilter<?
extends ExpiringSession> sessionRepositoryFilter) {
List<String> requestMappingUrls = getRequestMappingHandlerMapping();
FilterRegistrationBean bean = new FilterRegistrationBean();
bean.setFilter(sessionRepositoryFilter);
bean.setUrlPatterns(requestMappingUrls);
bean.setOrder(SessionRepositoryFilter.DEFAULT_ORDER);
return bean;
}