Spring boot:拦截对静态托管资源文件的请求
Spring boot: Intercepting requests for statically hosted resource files
在我的 Spring 引导应用程序中,我正在托管应用程序外部的文件。通过 addResourceHandler() 方法完成的。
此外,我需要通过检查几个 session 属性来验证对这些文件的访问。为此,我添加了一个拦截器。
问题: 拦截时,在拦截器的preHandle中,HttpServletRequest在部署时没有任何session信息(没有session) LINUX 通过代理路由器 apache 设置。但是,当 windows 上的 运行 直接来自我的 IDE 时,HttpServletRequest 确实具有正确的 session.
代码如下:
@Configuration
@AutoConfigureAfter(DispatcherServletAutoConfiguration.class)
public class ULCMvcConfigurerAdapter extends WebMvcConfigurerAdapter {
@Autowired
private ThumbnailViewRequestInterceptor thumbnailViewRequestInterceptor;
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/content/thumbnails/**").addResourceLocations("file:/app/content/files/).setCachePeriod(60*60*24);
}
@Bean
public MappedInterceptor createThumbnailInterceptor() {
return new MappedInterceptor("/content/thumbnails/**", "/content/thumbnails/public/**", thumbnailViewRequestInterceptor);
}
}
@Component
public class ThumbnailViewRequestInterceptor extends HandlerInterceptorAdapter {
@Autowired
private UserService userService;
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object object, Exception arg3) throws Exception {
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object object, ModelAndView model) throws Exception {
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object object) throws Exception {
final boolean allowAccess = someOperationOnRequestObject(request.getSession(false), request.getRequestURL());
return allowAccess;
}
}
以下是我的 apache conf 设置:
<VirtualHost *:80>
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
<Proxy "balancer://cluster">
BalancerMember http://10.76.2.72:8081/ keepalive=on retry=20 route=1
BalancerMember http://10.76.2.72:8082/ keepalive=on retry=20 route=2
ProxySet stickysession=ROUTEID
</Proxy>
<Location /balancer-manager>
SetHandler balancer-manager
</Location>
ProxyPass /balancer-manager !
ProxyPass / "balancer://cluster/" maxattempts=6 timeout=60
ProxyPassReverse / "balancer://cluster"
</VirtualHost>
headers 我遗漏了什么?
在 memcache 配置中发现了从会话备份中跳过静态资源的问题
**MemcachedBackupSessionManager manager = new MemcachedBackupSessionManager();
manager.setRequestUriIgnorePattern(".*\.(ico|png|gif|jpg|css|js)$");**
这从未在我的 httprequest 中设置会话信息
在我的 Spring 引导应用程序中,我正在托管应用程序外部的文件。通过 addResourceHandler() 方法完成的。
此外,我需要通过检查几个 session 属性来验证对这些文件的访问。为此,我添加了一个拦截器。
问题: 拦截时,在拦截器的preHandle中,HttpServletRequest在部署时没有任何session信息(没有session) LINUX 通过代理路由器 apache 设置。但是,当 windows 上的 运行 直接来自我的 IDE 时,HttpServletRequest 确实具有正确的 session.
代码如下:
@Configuration
@AutoConfigureAfter(DispatcherServletAutoConfiguration.class)
public class ULCMvcConfigurerAdapter extends WebMvcConfigurerAdapter {
@Autowired
private ThumbnailViewRequestInterceptor thumbnailViewRequestInterceptor;
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/content/thumbnails/**").addResourceLocations("file:/app/content/files/).setCachePeriod(60*60*24);
}
@Bean
public MappedInterceptor createThumbnailInterceptor() {
return new MappedInterceptor("/content/thumbnails/**", "/content/thumbnails/public/**", thumbnailViewRequestInterceptor);
}
}
@Component
public class ThumbnailViewRequestInterceptor extends HandlerInterceptorAdapter {
@Autowired
private UserService userService;
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object object, Exception arg3) throws Exception {
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object object, ModelAndView model) throws Exception {
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object object) throws Exception {
final boolean allowAccess = someOperationOnRequestObject(request.getSession(false), request.getRequestURL());
return allowAccess;
}
}
以下是我的 apache conf 设置:
<VirtualHost *:80>
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
<Proxy "balancer://cluster">
BalancerMember http://10.76.2.72:8081/ keepalive=on retry=20 route=1
BalancerMember http://10.76.2.72:8082/ keepalive=on retry=20 route=2
ProxySet stickysession=ROUTEID
</Proxy>
<Location /balancer-manager>
SetHandler balancer-manager
</Location>
ProxyPass /balancer-manager !
ProxyPass / "balancer://cluster/" maxattempts=6 timeout=60
ProxyPassReverse / "balancer://cluster"
</VirtualHost>
headers 我遗漏了什么?
在 memcache 配置中发现了从会话备份中跳过静态资源的问题
**MemcachedBackupSessionManager manager = new MemcachedBackupSessionManager();
manager.setRequestUriIgnorePattern(".*\.(ico|png|gif|jpg|css|js)$");**
这从未在我的 httprequest 中设置会话信息