zoukankan      html  css  js  c++  java
  • springboot 通过拦截器获取请求参数

    环境:windows10 ,jdk1.8,springboot
    <dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-core</artifactId>
    <version>5.5.7</version>
    </dependency>
    
    
    <dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.11</version>
    </dependency>
    1.通过拦截器获取请求参数,get/post形式
    public class ParamValidInterceptor implements HandlerInterceptor {
        enum SUBMIT_TYPE{
            FORM,
            BODY_JSON
        }
        Map<SUBMIT_TYPE,IValidTransParam> map = new HashMap<SUBMIT_TYPE,IValidTransParam>(){
            {
                put(SUBMIT_TYPE.FORM,new FormParam());
                put(SUBMIT_TYPE.BODY_JSON,new BodyJsonParam());
            }
        };
    
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {
            if(VerifyConstants.PROPERTEIS_VALID == VerifyConstants.IS_VALID){
                String submitSign;
                IValidTransParam iValidTransParam ;
                Map<String, String[]> parameterMap = request.getParameterMap();
                if(parameterMap.size() == 1 && ObjectUtil.isNotEmpty(parameterMap.get(VerifyConstants.VALID_KEY))){
                    //body请求参数提交
                    iValidTransParam = map.get(SUBMIT_TYPE.BODY_JSON);
                }else {
                    //form表单参数提交
                    iValidTransParam = map.get(SUBMIT_TYPE.FORM);
                }
            String param = iValidTransParam.getVerifySignParam(request);
            System.out.println("请求参数:"+param);
                return true;
            }
            return true;
        }
    
        @Override
        public void postHandle(HttpServletRequest var1, HttpServletResponse var2, Object var3, ModelAndView var4) throws Exception {
    
        }
    
        @Override
        public void afterCompletion(HttpServletRequest var1, HttpServletResponse var2, Object var3, Exception var4) throws Exception {
    
        }
    
        private void consoleLog(String msg,String... params){
            if(VerifyConstants.PROPERTIES_VALID_PRINT == VerifyConstants.IS_VALID_PRINT){
                Console.log(msg, params);
            }
        }
    }
    
    public interface IValidTransParam {
    
        String getVerifySignParam(HttpServletRequest request);
    
    }
    
    public abstract  class AbstrctValidTransParam implements IValidTransParam {
        protected  void consoleLog(String msg,String... params){
                Console.log(msg, params);
        }
    }
    
    public class BodyJsonParam extends AbstrctValidTransParam {
        @Override
        public String getVerifySignParam(HttpServletRequest request) {
            BodyHttpServletRequestWrapper bodyHttpServletRequestWrapper = (BodyHttpServletRequestWrapper)request;
            String body = bodyHttpServletRequestWrapper.getBody();
            JSONObject jsonObject = JSON.parseObject(body);
    
            System.out.println("################# body param ###################");
            System.out.println("body = " + body);
            System.out.println("################# body param ###################");
            return body;
        }
    }
    

      

    public class FormParam extends AbstrctValidTransParam {
        @Override
        public String getVerifySignParam(HttpServletRequest request) {
            consoleLog("############################form param ###########################");
            Map<String, String[]> parameterMap = request.getParameterMap();
            Map<String, String> sortMap = new LinkedHashMap<String, String>();
            //排序
            parameterMap.entrySet().stream()
                    .sorted(Map.Entry.comparingByKey())
                    .forEachOrdered(x -> sortMap.put(x.getKey(), x.getValue()[0]));
            StringBuilder stringBuilder = new StringBuilder();
            sortMap.remove(VerifyConstants.VALID_KEY);
            //构建加密原文
            for(Map.Entry<String,String> entry : sortMap.entrySet()){
                if (ObjectUtil.isNotEmpty(entry.getKey())|| ObjectUtil.isNotEmpty(entry.getValue())) {
                    consoleLog("key -> {},val -> {}", entry.getKey(), entry.getValue());
                    stringBuilder.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
                }
            }
            consoleLog("############################form param end ###########################");
            stringBuilder = stringBuilder.deleteCharAt(stringBuilder.length() - 1);
            return stringBuilder.toString();
        }
    }
    

      

    2.考虑获取body时是获取的流,request只能获取一次,所以需要重写filter
    public class BodyHttpServletRequestWrapper extends HttpServletRequestWrapper {
        private byte[] body;
        private ServletInputStream inputStream;
    
        public BodyHttpServletRequestWrapper(HttpServletRequest request) throws IOException {
            super(request);
            StandardServletMultipartResolver standardServletMultipartResolver = new StandardServletMultipartResolver();
            //做判断,过滤掉form表单形式的,避免form表单的参数
            if(standardServletMultipartResolver.isMultipart(request)){
    
            }else {
                body = StreamUtils.copyToByteArray(request.getInputStream());
                inputStream = new RequestCachingInputStream(body);
            }
        }
    
        public String getBody(){
            return new String(body);
        }
        @Override
        public ServletInputStream getInputStream() throws IOException {
            if (inputStream != null) {
                return inputStream;
            }
            return super.getInputStream();
        }
    
        @Override
        public Map<String, String[]> getParameterMap() {
            return super.getParameterMap();
        }
    
        private static class RequestCachingInputStream extends ServletInputStream {
    
            private final ByteArrayInputStream inputStream;
    
            public RequestCachingInputStream(byte[] bytes) {
                inputStream = new ByteArrayInputStream(bytes);
            }
            @Override
            public int read() throws IOException {
                return inputStream.read();
            }
    
            @Override
            public boolean isFinished() {
                return inputStream.available() == 0;
            }
    
            @Override
            public boolean isReady() {
                return true;
            }
    
            @Override
            public void setReadListener(ReadListener readlistener) {
            }
    
        }
    }
    

      

    3.将过滤和filter配置起来.
    

      配置过滤器

    1.第一种方法在配置文件中配置:(此只为方式,仅作为参考,拷贝过去肯定报错)
    <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <bean class="xxxx.xx.xxx.xxxInterceptor"></bean> </mvc:interceptor> </mvc:interceptors> 2.编写类来进行配置 (此只为方式,仅作为参考,拷贝过去肯定报错) @Configuration public class WebMvcConfig implements WebMvcConfigurer { @Autowired private MyInterceptor myInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { // 添加拦截器 registry.addInterceptor(myInterceptor) .excludePathPatterns("") // 排除拦截器要拦截的路径 .addPathPatterns(""); // 添加拦截器需要要拦截的路径 } }

      

    配置filter
    1.第一种方式,编写类来进行配置,然后通过配置扫描来扫这个包,当然如果再springboot启动类之下的无需单独配置..
    @Configuration
    public class RequserAgainFilter implements Filter {
        public RequserAgainFilter() {
        }
    
        public void init(FilterConfig filterConfig) throws ServletException {
        }
    
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            filterChain.doFilter(new BodyHttpServletRequestWrapper((HttpServletRequest)servletRequest), servletResponse);
        }
    
        public void destroy() {
        }
    }
    
    2.通过编写配置类
    @Configuration
    public class FilterConfig {
    
        @Autowired
        private AuthFilter authFilter;
    
        @Bean
        public FilterRegistrationBean registerAuthFilter() {
            FilterRegistrationBean registration = new FilterRegistrationBean();
            registration.setFilter(authFilter);
            registration.addUrlPatterns("/*");
            registration.setName("authFilter");
            registration.setOrder(1);  //值越小,Filter越靠前。
            return registration;
        }
        
        //如果有多个Filter,再写一个public FilterRegistrationBean registerOtherFilter(){...}即可。
    }
    

      

  • 相关阅读:
    兼容 数组 api map代码
    => 应用在js回调函数中
    let防止变量声明提前
    for-in 的坑
    call 与 apply的区别
    放大镜 鼠标滑入 鼠标滑轮放大
    js 获取元素宽
    [转]AES加密填充模式
    快被AES整崩溃了
    [转]C++ Socket编程步骤
  • 原文地址:https://www.cnblogs.com/zf-crazy/p/14301069.html
Copyright © 2011-2022 走看看