0

J'utilise le projet de démarrage de démarrage au printemps, les données de chaîne de retour RestController.spring boot RestController get HttpServletResponse contenu

Je souhaite obtenir un contenu de réponse dans Filtre.

Mais ne peux pas obtenir, s'il vous plaît aidez-moi.

contrôleur:

@RestController 
@RequestMapping(value = "/service/example") 
public class ExampleController { 
    @RequestMapping(value = "/get/test", method = RequestMethod.POST) 
    public String message(@RequestBody String data) { 
     return "test"; 
    } 

    @RequestMapping(value = "/get/test1", method = RequestMethod.POST) 
    public void message(HttpServletRequest request, HttpServletResponse response) throws IOException { 
     PrintWriter writer = response.getWriter(); 
     writer.write("dfsfd"); 
     writer.flush(); 
    } 
} 

Filtre:

@WebFilter(filterName="myFilter",urlPatterns="/service/*") 
public class MyFilter extends OncePerRequestFilter { 
    @Override 
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) 
     throws ServletException, IOException { 
     MyHttpServletResponseWrapper responseWrapper = new MyHttpServletResponseWrapper(response); 
     filterChain.doFilter(request, responseWrapper); 
     String responseContent = responseWrapper.getContent(); 
     System.out.println("response="+responseContent); 
    } 
} 

MyHttpServletResponseWrapper:

public class MyHttpServletResponseWrapper extends HttpServletResponseWrapper { 

    private PrintWriter cachedWriter; 
    private CharArrayWriter bufferedWriter; 

    /** 
    * Constructs a response adaptor wrapping the given response. 
    * 
    * @param response The response to be wrapped 
    * @throws IllegalArgumentException if the response is null 
    */ 
    public MyHttpServletResponseWrapper(HttpServletResponse response) { 
     super(response); 
     bufferedWriter = new CharArrayWriter(); 
     cachedWriter = new PrintWriter(bufferedWriter); 
    } 

    @Override 
    public PrintWriter getWriter() throws IOException { 
     return cachedWriter; 
    } 

    /** 
    * 获取原始HTML 
    * 
    * @return 
    */ 
    public String getContent() { 
     byte[] bytes = bufferedWriter.toString().getBytes(); 
     try { 
      return new String(bytes, "UTF-8"); 
     } catch (UnsupportedEncodingException e) { 
      return ""; 
     } 
    } 
} 

poste à/services/exemple/get/test ne peux pas obtenir le contenu. mais la publication dans/service/example/get/test1 peut obtenir du contenu.

pourquoi?

Mon projet a beaucoup de repos comme/service/exemple/get/test, je ne veux pas changer chacun.

comment obtenir le contenu de la réponse dans le filtre, s'il vous plaît aider, merci !!!

Répondre

0

J'ai créé un simple projet de démarrage de printemps, dans ce projet, vous pouvez contrôler l'URL que vous souhaitez filtrer:

classe de service de repos (3 services, nous filtrerons 2 uniquement)

import java.io.IOException; 
import java.io.PrintWriter; 

import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.boot.web.servlet.FilterRegistrationBean; 
import org.springframework.context.annotation.Bean; 
import org.springframework.web.bind.annotation.RequestBody; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 
import org.springframework.web.bind.annotation.RestController; 
import org.springframework.web.filter.GenericFilterBean; 

@SpringBootApplication 
@RestController 
@RequestMapping(value = "/service/example") 
public class DemoApplication { 

    public static void main(String[] args) { 
     SpringApplication.run(DemoApplication.class, args); 
    } 

    @RequestMapping(value = "/get/test", method = RequestMethod.POST) 
    public String message(@RequestBody String data) { 
     return "test"; 
    } 

    @RequestMapping(value = "/get/test1", method = RequestMethod.POST) 
    public void message(HttpServletRequest request, HttpServletResponse response) throws IOException { 
     PrintWriter writer = response.getWriter(); 
     writer.write("dfsfd"); 
     writer.flush(); 
    } 

    @RequestMapping(value = "/api", method = RequestMethod.POST) 
    public void messages(HttpServletRequest request, HttpServletResponse response) throws IOException { 
     PrintWriter writer = response.getWriter(); 
     writer.write("dfsfd"); 
     writer.flush(); 
    } 


    @Bean 
    public FilterRegistrationBean someFilterRegistration() { 

     FilterRegistrationBean registration = new FilterRegistrationBean(); 
     registration.setFilter(myFilter()); 
     registration.addUrlPatterns("/service/example/get/*"); 
     registration.setOrder(1); 
     return registration; 
    } 

    @Bean(name = "someFilter") 
    public GenericFilterBean myFilter() { 
     return new MyFilter(); 
    } 
} 

MyFilter classe:

import java.io.IOException; 
import javax.servlet.FilterChain; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 
import org.springframework.web.filter.GenericFilterBean; 

public class MyFilter extends GenericFilterBean { 

    @Override 
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) 
      throws IOException, ServletException { 
     System.out.println("Filter called"); 
     filterChain.doFilter(servletRequest, servletResponse); 
    } 

} 

essayer d'appeler 3 services:

http://localhost:8080/service/example/get/test

http://localhost:8080/service/example/get/test1

http://localhost:8080/service/example/api

et vérifiez le journal imprimé.

vous pouvez contrôler le crépitement url en utilisant cette ligne

registration.addUrlPatterns("/service/example/get/*"); 

J'espère que cet exemple vous aide, grâce