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

