Dans le processus d'autorisation Spring Security (classe de vote, etc.) Je pense qu'il y a des cas où vous devez vous référer au corps de la requête. (Par exemple, lors de la mise à jour de la base de données avec POST ou PUT, etc.
Cependant, dans la classe HttpServletRequest Le corps est un flux et ne peut être lu qu'une seule fois.
Donc, cette fois, je vais vous présenter comment lire Body plusieurs fois.
① Tenez les informations lues sur Body (2) Remplacez la source d'acquisition du corps par les informations de (1)
Classe de flux Défini comme type de retour lors de l'appel de HttpServletRequest.getInputStream () Utiliser un tableau d'octets pour l'initialisation
BufferedServletInputStream.java
public class BufferedServletInputStream extends ServletInputStream {
private ByteArrayInputStream inputStream;
//Initialiser avec un tableau d'octets
public BufferedServletInputStream(byte[] buffer) {
this.inputStream = new ByteArrayInputStream(buffer);
}
@Override
public int available() throws IOException {
return inputStream.available();
}
@Override
public int read() throws IOException {
return inputStream.read();
}
@Override
public int read(byte[] b, int off, int len) throws IOException {
return inputStream.read(b, off, len);
}
@Override
public boolean isFinished() {
return false;
}
@Override
public boolean isReady() {
return false;
}
@Override
public void setReadListener(ReadListener listener) {
}
}
Classe Wrapper pour HttpServletRequest
BufferedServletRequestWrapper.java
public class BufferedServletRequestWrapper extends HttpServletRequestWrapper {
private byte[] buffer;
public BufferedServletRequestWrapper(HttpServletRequest request) throws IOException {
super(request);
//Obtenir le flux à partir du corps de la demande
InputStream is = request.getInputStream();
//Convertir Stream en tableau d'octets et le conserver dans la variable d'instance
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte buff[] = new byte[1024];
int read;
while ((read = is.read(buff)) > 0) {
baos.write(buff, 0, read);
}
this.buffer = baos.toByteArray();
}
//Remplacez la source d'acquisition du corps par cette méthode
@Override
public ServletInputStream getInputStream() throws IOException {
//Initialiser la classe Stream et retourner
return new BufferedServletInputStream(this.buffer);
}
}
Classe de filtre Remplacer par requête par OncePerRequestFilter
MultipleReadEnableFilter.java
@Component
public class MultipleReadEnableFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
//Initialiser la classe wrapper à partir de HttpServletRequest
HttpServletRequest wrappedRequest = new BufferedServletRequestWrapper((HttpServletRequest) request);
filterChain.doFilter(wrappedRequest, response);
}
}
Définir le filtre créé dans la classe de paramètres Spring Security
//Envelopper pour lire l'entréeStream plusieurs fois
http.addFilter(multipleReadEnableFilter);
Numéro spécial de Yamaoku Tsushin
Recommended Posts