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(){...}即可。
}

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM