最近想了下springboot前端路径的伪静态实现。
通过百度最容易找到的方案是使用urlrewritefilter这个依赖。不过一想到要为这么一件事情就添加一个依赖,还要再添加一个配置文件,还要挨个写一遍所有的路径映射就觉得头疼,所以pass。
跟踪了一下springboot WEB请求处理的过程,找到了一个关键类:UrlPathHelper
。在获取Handler之前,由这个类负责解析请求路径。正好可以在WebMvcConfigurer
中配置UrlPathHelper
类的实例,这就给了我们动些手脚的空间。
更贴心的是,springboot获取请求路径的第一选择不是调用HttpServletRequest.getRequestURI()
方法或者HttpServletRequest.getServletPath()
方法,而是从HttpServletRequest
的attribute中获取,这样能省下不少力气。
来看下实现方式。
1. 实现伪静态路径解析类
伪静态路径解析类是UrlPathHelper
类的一个子类,通过重写getRequestUri()
方法实现了伪静态路径的处理。
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
public class PseudoStaticPathHelper extends UrlPathHelper { private static final String SUFFIX = ".html"; @Override public String getRequestUri(HttpServletRequest request) { String uri = request.getRequestURI(); if (!uri.endsWith(SUFFIX)) { return super.getRequestUri(request); } String path = (String) request.getAttribute(INCLUDE_REQUEST_URI_ATTRIBUTE); if (null == path) { int idx = uri.indexOf(SUFFIX); uri = uri.substring(0, idx); request.setAttribute(INCLUDE_REQUEST_URI_ATTRIBUTE, uri); request.setAttribute(INCLUDE_SERVLET_PATH_ATTRIBUTE, uri); } return super.getRequestUri(request); } } |
代码中的核心部分是下面两句:
1 2 |
request.setAttribute(INCLUDE_REQUEST_URI_ATTRIBUTE, uri); request.setAttribute(INCLUDE_SERVLET_PATH_ATTRIBUTE, uri); |
在后面处理中,springboot会优先从Attribute
中获取请求路径。
2. 添加WebMvcConfigurer
配置类
然后需要在WebMvcConfigurer
中配置PseudoStaticPathHelper
实例。
实现方式如下:
1 2 3 4 5 6 7 8 9 10 |
@Configuration public class WebConfig implements WebMvcConfigurer { private UrlPathHelper urlPathHelper = new PseudoStaticPathHelper(); @Override public void configurePathMatch(PathMatchConfigurer configurer) { configurer.setUrlPathHelper(urlPathHelper); } } |
然后——这样就可以了。
不写示例应用了。在 Calf 这个项目中有类似的用法,有需要就看看。
End!
发表评论