机会都是留给有准备的人的
在采用拦截器预处理入参的时候,我们需要了解拦截器是什么东西,简单的说就是进入程序之前我们规定的必须要进行一些接口的过滤或者去预处理这个东西就产生了,实现方式我们通过WebMvcConfigurer 进行配置拦截器以及需要拦截的内容,在编写拦截器程序即可完成操作。
自定义拦截器步骤如下:
- 自定义一个实现了Interceptor接口的类,或者继承抽象类AbstractInterceptor。
- 在配置文件中注册定义的拦截器。
- 在需要使用Action中引用上述定义的拦截器,为了方便也可以将拦截器定义为默认的拦截器。
自定义拦截器
进行入参预处理时需要在preHandle方法中进行,该方法会返回处理成功或者失败,亦可以通过response直接返回输出错误提示信息。
public class ParamsInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("===========进入ParamsInterceptor===========");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=utf-8");
// 获取HttpServletRequest 中Request PayLoad 格式入参数据
StringBuilder sb = new StringBuilder();
JSONObject builderJson = null;
try(BufferedReader reader = request.getReader();) {
char[]buff = new char[1024];
int len;
while((len = reader.read(buff)) != -1) {
sb.append(buff,0, len);
}
String str = sb.toString();
builderJson = JSONObject.parseObject(str);
}catch (IOException e) {
e.printStackTrace();
}
String data = builderJson.getString("data");// 从 http 请求头中取出 data
String timestamp = builderJson.getString("timestamp"); // 从http 请求头中获取间戳
String sign = builderJson.getString("sign");
String inRawSign = String.format("data=\"%s\"×tamp=%s", data, timestamp);
String inSign;
try {
inSign = SM3Util.digest(inRawSign.trim());
} catch (Exception e) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("code", 400);
jsonObject.put("msg", "验证参数签名失败!");
response.getWriter().print(jsonObject.toString());
return false;
}
if (!inSign.toUpperCase().equals(sign)) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("code", 400);
jsonObject.put("msg", "验证参数签名失败!");
response.getWriter().print(jsonObject.toString());
return false;
}
try {
System.out.println("==============getdata======"+data.split("&"));
for (String str:
data.split("&")) {
String[] strList = str.split("=");
request.setAttribute((String) strList[0], URLDecoder.decode((String) strList[1],"UTF-8"));
}
} catch (Exception e) {
response.setStatus(400);
response.getWriter().print("解密失败");
return false;
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// TODO Auto-generated method stub
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// TODO Auto-generated method stub
}
}
注册定义的拦截器
在注册定义的拦截器是需要实现WebMvcConfigurer 接口,在该接口中完成拦截器的注册以及需要的拦截配置,在实现类的addInterceptors方法中需要去注册你自定义的拦截器,然后通过excludePathPatterns方法去拦截你不想拦截的内容或者接口。
@Configuration
public class SongShaoWebMvcConfigurer implements WebMvcConfigurer{
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new ParamsInterceptor()).excludePathPatterns("/login/**","/home");
}
}