我必须多次阅读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?
没有这样的方法。你唯一能做的就是每次阅读请求时都将其包装在一个过滤器中。每次阅读请求复制正文之前都包装好它。
查看包装器的一些工作代码,例如
这是一个老问题,但如果有人遇到同样的问题:
您可以像上一个答案中建议的那样包装请求,但需要在通过身份验证过滤器过滤之前包装它:
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控制器。我试过这个: 但我得到 将内容转换成字符串变量的正确方法是什么?