当前位置: 首页 > 知识库问答 >
问题:

多次使用HttpServletRequest并在方法之间链接

景光赫
2023-03-14

我必须多次阅读HttpServletRequest。我已经像在那些帖子中所说的那样包装了HttpServletRequest Http Servlet请求在阅读一次后从帖子正文中丢失了参数

在我扩展AbstractAuthentiationProcessingFilter的过滤器类中,我可以在成功身份验证方法中消耗和链接请求,因为它具有链参数。但除了这些解决方案之外,我还必须在尝试和成功的身份验证步骤之间链接请求:

public Authentication attemptAuthentication(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws AuthenticationException, IOException, ServletException {
            // wrapping request and consuming
        }

    @Override
    protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authResult) throws IOException, ServletException {
        // Since i couldn't chain wrapped httpServletRequest from attemptAuthentication step, this request still gets non-wrapping one and  inputstream is empty
    }

如何将包装好的请求从attemptAuthentication传递到successfulAuthentication?

共有2个答案

严亦
2023-03-14

没有这样的方法。你唯一能做的就是每次阅读请求时都将其包装在一个过滤器中。每次阅读请求复制正文之前都包装好它。

查看包装器的一些工作代码,例如

樊运乾
2023-03-14

这是一个老问题,但如果有人遇到同样的问题:

您可以像上一个答案中建议的那样包装请求,但需要在通过身份验证过滤器过滤之前包装它:

Spring Security配置如下所示:

@Override
    protected void configure(HttpSecurity http) throws Exception {
        AuthFilter authFilter = new AuthFilter();
        WrapperFilter wrapperFilter = new WrapperFilter();
        http    .cors()
                .and()
                .csrf().disable()
                .exceptionHandling().authenticationEntryPoint(exceptionHandler)
                .and()
                .authorizeRequests()
                .antMatchers("/v1/*", "/api/*")
                .authenticated()
                .and()
                .addFilterBefore(authFilter, BasicAuthenticationFilter.class)
                .addFilterBefore(wrapperFilter, AuthFilter.class);
    }

因此,包装过滤器在您的身份验证过滤器和包装过滤器的doFilter包装请求并将其传递之前:

@Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        MultiReadHttpServletRequest wrapper = new MultiReadHttpServletRequest((HttpServletRequest) request);
        chain.doFilter(wrapper, response);
    }

MultiReadHttpServletRequest如下所示:

public class MultiReadHttpServletRequest extends HttpServletRequestWrapper {

    private byte[] body;

    public MultiReadHttpServletRequest(HttpServletRequest request) {
        super(request);
        try {
            body = IOUtils.toByteArray(request.getInputStream());
        } catch (IOException ex) {
            body = new byte[0];
        }
    }

    @Override
    public BufferedReader getReader() throws IOException {
        return new BufferedReader(new InputStreamReader(getInputStream(), getCharacterEncoding()));
    }

    @Override
    public ServletInputStream getInputStream() throws IOException {
        return new ServletInputStream() {
            ByteArrayInputStream wrapperStream = new ByteArrayInputStream(body);

            @Override
            public boolean isFinished() {
                return false;
            }

            @Override
            public boolean isReady() {
                return false;
            }

            @Override
            public void setReadListener(ReadListener readListener) {

            }

            @Override
            public int read() throws IOException {
                return wrapperStream.read();
            }
        };
    }
}
 类似资料:
  • 我试图解决的问题的措辞如下: 您将获得两个链表:大小分别为n和m的list1和list2。从ath节点到bth节点删除list1的节点,并将list2放置到位。 我将我的解决方案写成: 我很难理解为什么它不起作用。我似乎找不到我的错误

  • 该方案应做到以下几点: 当这是运行时,所有的输出是“请输入你的心率:”。一旦我输入一个整数,程序就结束了。做错了什么?

  • 问题内容: 我正在制作一个简单,非常轻便的前控制器。我需要将请求路径匹配到不同的处理程序(操作),以便选择正确的处理程序。 在我的本地计算机上并返回相同的结果。但是我不确定他们将在生产环境中返回什么。 那么,这些方法有什么区别,我应该选择什么? 问题答案: 给出URI后面的额外路径信息,用于访问Servlet,其中给出完整的URI。 我本以为它们会有所不同,因为首先必须为Servlet配置自己的U

  • 我正在开发一个Spring应用程序,并在HandlerInterceptorAdapter的预处理()方法中对用户进行身份验证,如果用户进行了身份验证,我将如下设置请求属性: 如果用户未通过身份验证,我是这样设置的 然后在稍后的控制器方法中,我用HttpServletRequest检索用户,如下所示: 问题是我需要在每个控制器方法中接收HttpServletRequest,以检查用户是否经过身份验

  • 我正在使用这种方法,但它不适用于第一个片段,但在从第二个片段滑动到第一个片段时,它工作良好。请帮我做这件事。谢谢

  • 我想从请求和响应中获得XML数据,并将其用于Rest控制器。我试过这个: 但我得到 将内容转换成字符串变量的正确方法是什么?