昨天接到的一个需求,无论用户在浏览器上输入什么路径除了"/api"开头的不进行拦截,其它的路径都会进行拦截指定到同一个页面上,但是浏览器栏的URL不变,我最初使用的是拦截器
public class CustomIntercepter implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
//判断拦截的路径中是否包含/api如果是让它走到正常的controller,如果不是直接重定向到页面
if (httpServletRequest.getRequestURI().contains("/api")||httpServletRequest.getRequestURI().contains(".html")){
return true;
}else {
httpServletRequest.getRequestDispatcher("aaa.html").forward(httpServletRequest,httpServletResponse);
return false;
}
}
但是结果如下
获取到的路径居然是error.很是纳闷,最后采用Filter过滤器的做法
public class FilterConfigurer {
@Autowired
private ReloadFilter reloadFilter;
@Bean
public FilterRegistrationBean authorizeFilterRegistration() {
FilterRegistrationBean registration = new FilterRegistrationBean(reloadFilter);
registration.addUrlPatterns("/*");
registration.setOrder(2);
return registration;
}
}
@Service(value = "reloadFilter")
public class ReloadFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException {
String servletPath = httpServletRequest.getServletPath();
if (servletPath.startsWith("/api")) {
filterChain.doFilter(httpServletRequest, httpServletResponse);
} else {
httpServletRequest.getRequestDispatcher("/index.html").forward(httpServletRequest, httpServletResponse);
}
}
}
居然能够获取到对应的URL了,目前还没找到具体的原因