老系统架构采用拦截器预处理入参解密

机会都是留给有准备的人的

在采用拦截器预处理入参的时候,我们需要了解拦截器是什么东西,简单的说就是进入程序之前我们规定的必须要进行一些接口的过滤或者去预处理这个东西就产生了,实现方式我们通过WebMvcConfigurer 进行配置拦截器以及需要拦截的内容,在编写拦截器程序即可完成操作。
自定义拦截器步骤如下:

  1. 自定义一个实现了Interceptor接口的类,或者继承抽象类AbstractInterceptor。
  2. 在配置文件中注册定义的拦截器。
  3. 在需要使用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\"&timestamp=%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");
	}
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值