目录

SpringBoot之拦截器获取项目根目录

目录

  • 在开发web客户端时,定位资源路径是,我们可以通过./来表示项目的相对路径,但是./会受到当前请求路径的影响,在很多情况下并不是一个很好的方法,通常情况下我们可以通过获取项目跟路径来解决这个问题。

  • 在JSP中我们有pageContext.request.ContextPath来定位。

  • 但是在使用SpringBoot时,一般我们都不推荐再使用JSP这个技术了。这也是官方文档为什么又没JSP与SpringBoot的使用的教程的原因。

  • 此时我们可以通过拦截器,在返回的使用,在requst中注入我们的bash路径。

      	import org.slf4j.Logger;
      	import org.slf4j.LoggerFactory;
      	import org.springframework.context.annotation.Bean;
      	import org.springframework.context.annotation.Configuration;
      	import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
      	import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
      	import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
      	import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
    
      	import javax.servlet.http.HttpServletRequest;
      	import javax.servlet.http.HttpServletResponse;
    
      	/**
      	 *
      	 */
      	@Configuration
      	public class WebRequestPathConfig extends WebMvcConfigurerAdapter {
    
      			private final static Logger logger = LoggerFactory.getLogger(WebRequestPathConfig.class);
    
    
      			@Bean
      			public RequestExtendPathInterceptor getRequestExtendPathInterceptor() {
      					return new RequestExtendPathInterceptor();
      			}
    
      			public void addInterceptors(InterceptorRegistry registry) {
      					InterceptorRegistration addInterceptor = registry.addInterceptor(getRequestExtendPathInterceptor());
    
      					// 拦截配置
      					addInterceptor.addPathPatterns("/**");
      			}
    
      			private class RequestExtendPathInterceptor extends HandlerInterceptorAdapter {
    
      					@Override
      					public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
      									throws Exception {
    
      							String scheme = request.getScheme();
      							String serverName = request.getServerName();
      							int port = request.getServerPort();
      							String path = request.getContextPath();
      							String basePath = scheme + "://" + serverName + ":" + port + path;
      							logger.info(basePath);
      							request.setAttribute("basePath", basePath);
      							return true;
      					}
      			}
      	}
    
    • 如上,我们在模版引擎的页面中就可以通过basePath来获取项目的根目录了