- 看了很多博客,发现都是用拦截器里面采用重定向、转发实现,发现并不是很友好,还存在bug,至少在我的需求里没达到我的理想效果
过滤器
- 实现Filter接口
- 重新doFilter方法
- 具体实现代码
@Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { RequestFacade facade = (RequestFacade) servletRequest; Class clazz = RequestFacade.class; try { Field field = clazz.getDeclaredField("request"); field.setAccessible(true); org.apache.catalina.connector.Request request = (org.apache.catalina.connector.Request) field.get(facade); Class requestClass = request.getClass(); Field coyoteField = requestClass.getDeclaredField("coyoteRequest"); coyoteField.setAccessible(true); org.apache.coyote.Request coyoteRequest = (org.apache.coyote.Request) coyoteField.get(request); Field uriMBField = coyoteRequest.getClass().getDeclaredField("uriMB"); uriMBField.setAccessible(true); MessageBytes uriMB = (MessageBytes) uriMBField.get(coyoteRequest); // 重新改变请求路径 String newUrl = "新的url"; uriMB.setString(newUrl); filterChain.doFilter(facade, servletResponse); } catch (Exception e) { e.printStackTrace(); } }