diff --git a/server/src/main/java/cn/keking/config/WebConfig.java b/server/src/main/java/cn/keking/config/WebConfig.java index dd67070d..eb85367d 100644 --- a/server/src/main/java/cn/keking/config/WebConfig.java +++ b/server/src/main/java/cn/keking/config/WebConfig.java @@ -30,11 +30,13 @@ public class WebConfig implements WebMvcConfigurer { registry.addResourceHandler("/**").addResourceLocations("classpath:/META-INF/resources/","classpath:/resources/","classpath:/static/","classpath:/public/","file:" + filePath); } + @Bean public FilterRegistrationBean getChinesePathFilter() { ChinesePathFilter filter = new ChinesePathFilter(); FilterRegistrationBean registrationBean = new FilterRegistrationBean<>(); registrationBean.setFilter(filter); + registrationBean.setOrder(10); return registrationBean; } @@ -67,14 +69,20 @@ public class WebConfig implements WebMvcConfigurer { @Bean public FilterRegistrationBean getBaseUrlFilter() { Set filterUri = new HashSet<>(); - filterUri.add("/index"); - filterUri.add("/"); - filterUri.add("/onlinePreview"); - filterUri.add("/picturesPreview"); BaseUrlFilter filter = new BaseUrlFilter(); FilterRegistrationBean registrationBean = new FilterRegistrationBean<>(); registrationBean.setFilter(filter); registrationBean.setUrlPatterns(filterUri); + registrationBean.setOrder(20); + return registrationBean; + } + + @Bean + public FilterRegistrationBean getUrlCheckFilter() { + UrlCheckFilter filter = new UrlCheckFilter(); + FilterRegistrationBean registrationBean = new FilterRegistrationBean<>(); + registrationBean.setFilter(filter); + registrationBean.setOrder(30); return registrationBean; } diff --git a/server/src/main/java/cn/keking/web/filter/UrlCheckFilter.java b/server/src/main/java/cn/keking/web/filter/UrlCheckFilter.java new file mode 100644 index 00000000..572486f9 --- /dev/null +++ b/server/src/main/java/cn/keking/web/filter/UrlCheckFilter.java @@ -0,0 +1,52 @@ +package cn.keking.web.filter; + +import org.apache.commons.lang3.StringUtils; + +import javax.servlet.*; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @date 2023/11/30 + */ +public class UrlCheckFilter implements Filter { + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { + + final HttpServletRequest httpServletRequest = (HttpServletRequest) request; + String servletPath = httpServletRequest.getServletPath(); + + boolean redirect = false; + + // servletPath 中不能包含 // + if (servletPath.contains("//")) { + servletPath = servletPath.replaceAll("//+", "/"); + redirect = true; + } + + // 不能以 / 结尾,同时考虑 **首页** 的特殊性 + if (servletPath.endsWith("/") && servletPath.length() > 1) { + servletPath = servletPath.substring(0, servletPath.length() - 1); + redirect = true; + } + if (redirect) { + String redirectUrl; + if (StringUtils.isBlank(BaseUrlFilter.getBaseUrl())) { + // 正常 BaseUrlFilter 有限此 Filter 执行,不会执行到此 + redirectUrl = httpServletRequest.getContextPath() + servletPath; + } else { + if (BaseUrlFilter.getBaseUrl().endsWith("/") && servletPath.startsWith("/")) { + // BaseUrlFilter.getBaseUrl() 以 / 结尾,servletPath 以 / 开头,需再去除一次 // + redirectUrl = BaseUrlFilter.getBaseUrl() + servletPath.substring(1); + } else { + redirectUrl = BaseUrlFilter.getBaseUrl() + servletPath; + } + } + ((HttpServletResponse) response).sendRedirect(redirectUrl + "?" + httpServletRequest.getQueryString()); + } else { + chain.doFilter(request, response); + } + } +}