document.write("");

后台 - 简易开发点记录

1. 在Filter中修改请求的path

 RequestFacade facade= (RequestFacade) req;
            Class clzz=RequestFacade.class;
            try {
                Field field=clzz.getDeclaredField("request");
                field.setAccessible(true);
                org.apache.catalina.connector.Request request1=(org.apache.catalina.connector.Request) field.get(facade);
                Class requestClass=request1.getClass();
                //获取封装org.apache.coyote.Request的字段
                Field coyoteField=requestClass.getDeclaredField("coyoteRequest");
                coyoteField.setAccessible(true);
                Request coyoteRequest=(Request)coyoteField.get(request1);
                Class requestClazz=Request.class;
                //获取org.apache.coyote.Request中保存路径的字段
                Field uriMBField= requestClazz.getDeclaredField("uriMB");
                uriMBField.setAccessible(true);
                MessageBytes uriMB=(MessageBytes)uriMBField.get(coyoteRequest);
                //这里就是改变路径的地方
                String addPath = "/newPathPrew" + uriMB.getString();
                uriMB.setString(addPath);
                chain.doFilter(facade,response);
                //用来打印请求路径
//                System.out.println(((RequestFacade) req).getRequestURL());
            } catch (NoSuchFieldException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }

2. springboot中使用proxyservlet的 formdata传参 bug

    @Bean
    public org.springframework.boot.web.servlet.FilterRegistrationBean registration(org.springframework.web.filter.HiddenHttpMethodFilter filter) {
        FilterRegistrationBean registration = new FilterRegistrationBean(filter);
        registration.setEnabled(false);
        return registration;
    }

3. 配置多个 proxyServletRegistrationAuth

类使用 @Configuration,方法名称不同即可

    @Bean
    @SuppressWarnings(value={"unchecked", "rawtypes"})
    public ServletRegistrationBean proxyServletRegistrationAuth(){
        ServletRegistrationBean registrationBean = new ServletRegistrationBean(new ProxyServlet(),"/xxx");
        registrationBean.setName("xxxServlet");
        registrationBean.addInitParameter("targetUri", "http://xxx.xxx.xxx:aaaa/xxx");
        registrationBean.addInitParameter(ProxyServlet.P_LOG, "true");
        return registrationBean;
    }

 4. 在 doFilter 中转发请求   使用 forward (application类上需加 @ServletComponentScan )

@WebFilter(urlPatterns = "/*")
public class DMZFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        String path = request.getRequestURI();

        if (特定条件) {
            request.getRequestDispatcher("/xxx" + path).forward(request,response);
            return;
        } else {
            chain.doFilter(req, res);
        }
    }

    @Override
    public void destroy() {
    }
}

 

 


相关博文地址:
https://www.cnblogs.com/java2java/p/13200636.html
https://www.jianshu.com/p/bff7ac3fa4ab

posted @ 2022-03-23 13:44  人间春风意  阅读(58)  评论(0)    收藏  举报