zoukankan      html  css  js  c++  java
  • spring boot 过滤器实现接收 压缩数据 并解压

    1.新加类GzipRequestWrapper 继承HttpServletRequestWrapper类

    public class GzipRequestWrapper  extends HttpServletRequestWrapper{
    
        private HttpServletRequest request;  
        private static final Logger LOGGER = LoggerFactory.getLogger(GzipRequestWrapper.class); 
    
        public GzipRequestWrapper(HttpServletRequest request) {  
            super(request);  
            this.request = request;  
        } 
    
    
        @Override  
        public ServletInputStream getInputStream() throws IOException {  
            
            ServletInputStream stream = request.getInputStream();  
            
            String contentEncoding = request.getHeader("Content-Encoding");  
            // 如果对内容进行了压缩,则解压  
            if (null != contentEncoding && contentEncoding.indexOf("gzip") != -1) {  
                try {  
                    final GZIPInputStream gzipInputStream = new GZIPInputStream(  
                            stream);  
    
                    ServletInputStream newStream = new ServletInputStream() {  
    
                        @Override  
                        public int read() throws IOException {  
                            return gzipInputStream.read();  
                        }
    
                        @Override
                        public boolean isFinished() {
                            return false;
                        }
    
                        @Override
                        public boolean isReady() {
                            return false;
                        }
    
                        @Override
                        public void setReadListener(ReadListener arg0) {
                            // TODO Auto-generated method stub
                            
                        }  
                    };  
                    return newStream;  
                } catch (Exception e) {  
                    LOGGER.debug("ungzip content fail.", e);  
                }  
            }  
            return stream;  
        }  
    
    
    }

    2.新加FilterGzip 实现 Filter(注意使用注解)

    @WebFilter(filterName="AccessFilter",urlPatterns="/")
    public class FilterGzip implements Filter {
    
        @Override
        public void destroy() {
            
        }
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
                throws IOException, ServletException {
            
            System.out.println("filter");
    
            chain.doFilter(new GzipRequestWrapper((HttpServletRequest) request),  
                    response);
            
        }
    
        @Override
        public void init(FilterConfig arg0) throws ServletException {
            
        }
    
    }

    3.在启动类添加

    @Bean  
        public FilterRegistrationBean  filterRegistrationBean() {  
            FilterRegistrationBean registrationBean = new FilterRegistrationBean();  
            FilterGzip httpBasicFilter = new FilterGzip();  
            registrationBean.setFilter(httpBasicFilter);  
            List<String> urlPatterns = new ArrayList<String>();  
            urlPatterns.add("/*");  
            registrationBean.setUrlPatterns(urlPatterns);  
            return registrationBean;  
        } 

    4.使用

    @RequestMapping(value="/info")
        public String receive(HttpServletRequest req){
            
            StringBuilder sb = null;
            String json = null;
            try {
                ServletInputStream inputStream = req.getInputStream();
    
                BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream,"UTF-8"));   
                sb = new StringBuilder();   
    
                String line = null;   
                while ((line = reader.readLine()) != null) {   
                    sb.append(line);   
                }
                json = URLEncoder.encode(sb.toString(), "UTF-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }  
            System.out.println("sb ----> " + sb.toString());
            if(sb != null){
                logger.info("**** 接收成功1条 ****");
            }
            MultiValueMap<String, String> paramMap = new LinkedMultiValueMap<>();
            paramMap.add("jsonStr", json);
            restTemplate.postForObject("http://SERVICE-DATA/pretreat", paramMap, String.class);
            
            logger.info("#### 传输 成功!####");
            
            return "ok";
        }
    欢迎指正,交流沟通,共同进步!对您有帮助的话点下推荐~~
  • 相关阅读:
    extjs数据类型
    Extjs 动态控制列显示
    400
    extjs主单清单同时编辑提交
    js-map模拟
    Leetcode 407.接雨水
    Leetcode 406.根据身高重建队列
    Leetcode 405.数字转化为十六进制数
    Leetcode 402.移掉k位数字
    Leetcode 401.二进制手表
  • 原文地址:https://www.cnblogs.com/gaoyawei/p/7090778.html
Copyright © 2011-2022 走看看