一、post请求的三种content-type

1、application/x-www-form-urlencoded 主要用于如下:
1.1: 最常见的POST提交数据方式。
1.2:原生form默认的提交方式(可以使用enctype指定提交数据类型)。
1.3:jquery,zepto等默认post请求提交的方式。

2、multipart/form-data
使用表单上传文件时,必须指定表单的 enctype属性值为 multipart/form-data. 请求体被分割成多部分,每部分使用 --boundary分割;

3、application/json
在http请求中,ContentType都是默认的值 application/x-www-form-urlencoded, 这种编码格式的特点是:name/value值对,
每组之间使用&连接,而name与value之间是使用 = 连接,比如 key=xxx&name=111&password=123456; 键值对一般的情况下是没有什么问题的,
是很简单的json形式;对于一些复制的数据对象,对象里面再嵌套数组的话,建议使用application/json传递比较好,开发那边也会要求使用application/json。因为他们那边不使用application/json的话,使用默认的application/x-www-form-urlencoded传递的话,开发那边先要解析成如上那样的,然后再解析成json对象,如果对于比上面更复杂的json对象的话,那么他们那边是很解析的,所以直接json对象传递的话,对于他们来说更简单。通过json的形式将数据发送给服务器。json的形式的优点是它可以传递结构复杂的数据形式,比如对象里面嵌套数组这样的形式等。

所以,application/json是现在最常用的请求contentType;

二、当前端发生ajax请求进行aes加密后,后台的请求对象要进行封装,而contentType不是application/json时候,后台要额外再封装一个请求对象,进行解析,成json对象,post请求;

1、前端公共js封装ajax请求的地方,对参数处理进行修改:

  1. var param;
  2. if(GLOBAL_CONFIG.aesOpen=='1'){
  3. var p=self.param||{};
  4. if(self.contentType=='application/json'){
  5. var rsaStr=FWRSAHelper.encrypt(self.param);
  6. param=JSON.stringify({p:encrypt(rsaStr,GLOBAL_CONFIG.aecKey)});
  7. }else{
  8. var rsaStr=FWRSAHelper.encrypt(JSON.stringify(self.param));
  9. param={p:encrypt(rsaStr,GLOBAL_CONFIG.aecKey)};
  10. }
  11. }else{
  12. param=self.param;
  13. }

2、后台请求过滤器java代码中修改:

  1.             
  1.             WrapperedResponse wrapResponse = new WrapperedResponse((HttpServletResponse) response);
  1.             if("application/json".equals(contentType)){
  2. WrapperedRequest wrapRequest = new WrapperedRequest((HttpServletRequest) request, rsaResult);
  3. chain.doFilter(wrapRequest, wrapResponse);
  4. }else{
  5. JSONObject jsonObject=JSONObject.parseObject(rsaResult);
  6. HashMap newParam=new HashMap();
  7. Iterator<String> it = jsonObject.keySet().iterator();
  8. while(it.hasNext()){
  9. String key = it.next();
  10. Object value = jsonObject.getString(key);
  11. newParam.put(key,value);
  12. }
  13. ParameterRequestWrapper wrapRequest=new ParameterRequestWrapper(request,newParam);
  14. chain.doFilter(wrapRequest, wrapResponse);
  15. }

其中,原先的代码不动,在对参数解密之后,如果contentType不是application/json时候,要对参数再进行一次解析,再封装一个请求对象;

封装的新的请求对象类:

  1. package com.xxx.common.util;
  2.  
  3. import javax.servlet.http.HttpServletRequest;
  4. import javax.servlet.http.HttpServletRequestWrapper;
  5. import java.util.Enumeration;
  6. import java.util.Map;
  7. import java.util.Vector;
  8.  
  9. /**
  10. * 该类用于改写request.getParameterNames里的值
  11. * 使用方法:HashMap newParam=new HashMap(request.getParameterMap());
  12. * ParameterRequestWrapper wrapRequest=new ParameterRequestWrapper(request,newParam);
  13. * */
  14. public class ParameterRequestWrapper extends HttpServletRequestWrapper {
  15. private Map params;
  16.  
  17. public ParameterRequestWrapper(HttpServletRequest request, Map newParams) {
  18. super(request);
  19. this.params = newParams;
  20. }
  21.  
  22. public Map getParameterMap() {
  23. return params;
  24. }
  25.  
  26. public Enumeration getParameterNames() {
  27. Vector l = new Vector(params.keySet());
  28. return l.elements();
  29. }
  30.  
  31. public String[] getParameterValues(String name) {
  32. Object v = params.get(name);
  33. if (v == null) {
  34. return null;
  35. } else if (v instanceof String[]) {
  36. return (String[]) v;
  37. } else if (v instanceof String) {
  38. return new String[] { (String) v };
  39. } else {
  40. return new String[] { v.toString() };
  41. }
  42. }
  43.  
  44. public String getParameter(String name) {
  45. Object v = params.get(name);
  46. if (v == null) {
  47. return null;
  48. } else if (v instanceof String[]) {
  49. String[] strArr = (String[]) v;
  50. if (strArr.length > 0) {
  51. return strArr[0];
  52. } else {
  53. return null;
  54. }
  55. } else if (v instanceof String) {
  56. return (String) v;
  57. } else {
  58. return v.toString();
  59. }
  60. }
  61. }

aes加解密后续问题contentType不是application/json时候后台解析请求对象request的更多相关文章

  1. .net mvc 站点自带简易SSL加密传输 Word报告自动生成(例如 导出数据库结构) 微信小程序:动画(Animation) SignalR 设计理念(一) ASP.NET -- WebForm -- ViewState ASP.NET -- 一般处理程序ashx 常用到的一些js方法,记录一下 CryptoJS与C#AES加解密互转

    .net mvc 站点自带简易SSL加密传输   因项目需要,传输数据需要加密,因此有了一些经验,现简易抽出来分享! 请求:前端cryptojs用rsa/aes 或 rsa/des加密,后端.net ...

  2. aes加解密前后端-后台

    一.web.xml: <filter> <filter-name>fastLoginFilter</filter-name> <filter-class> ...

  3. DES,AeS加解密,MD5,SHA加密

    1.DES一共就有4个参数参与运作:明文.密文.密钥.向量.其中这4者的关系可以理解为: 密文=明文+密钥+向量: 明文=密文-密钥-向量: 为什么要向量这个参数呢?因为如果有一篇文章,有几个词重复, ...

  4. c# Aes加解密和对象序列化

    aes加解密 public class AesCryptto { private string key = "hjyf57468jhmuist"; private string i ...

  5. Java、C#双语版配套AES加解密示例

      这年头找个正经能用的东西那是真难,网上一搜索一大堆,正经能用的没几个,得,最后还是得靠自己,正巧遇上需要AES加解密的地方了,而且还是Java和C#间的相互加解密操作,这里做个备忘 这里采用的加解 ...

  6. AES加解密算法Qt实现

    [声明] (1) 本文源码 在一位未署名网友源码基础上,利用Qt编程,实现了AES加解密算法,并添加了文件加解密功能.在此表示感谢!该源码仅供学习交流,请勿用于商业目的. (2) 图片及描述 除图1外 ...

  7. aes加解密 Illegal key size

    做aes加密时,发生一个奇怪的错误,在本地环境是好的,发布到测试环境就出问题, java.security.InvalidKeyException: Illegal key size 想到本地环境之前 ...

  8. C# RSA加解密与验签,AES加解密,以及与JAVA平台的密文加解密

    前言: RSA算法是利用公钥与密钥对数据进行加密验证的一种算法.一般是拿私钥对数据进行签名,公钥发给友商,将数据及签名一同发给友商,友商利用公钥对签名进行验证.也可以使用公钥对数据加密,然后用私钥对数 ...

  9. Aes加解密,php

    Aes类库 <?php namespace Aes; class Aes { /** * var string $method 加解密方法,可通过openssl_get_cipher_metho ...

随机推荐

  1. C++ 继承方式 //语法:class 子类 :继承方式 父类 //继承方式 三种: //1.公共继承 //2.保护继承 //3.私有继承

    1 //继承方式 2 //语法:class 子类 :继承方式 父类 3 //继承方式 三种: 4 //1.公共继承 5 //2.保护继承 6 //3.私有继承 7 8 #include <ios ...

  2. 方法对了,你做1年Android开发能顶别人做10年

    前几天后台有读者问我这样的问题.他在一家互联网公司工作3年了,每天都很忙,事情又多又杂. 本想着学习多一些东西也不是坏事,可到头来一无所获,什么都没学会,满腔的热情也被消磨得差不多. 三天两头动辞职的 ...

  3. 从理发店小弟到阿里P10大牛,一位高中学渣的“登天”之路

    蚂蚁金服,可能是众多程序猿眼中梦寐以求的归宿,无数拿过数不清奖状的各个高校走出的学子精英都挤破头皮,只为能在蚂蚁占有一席之地. 蚂蚁金服里不乏各种深藏不露的大佬,到了那里才会深刻明白一山还有一山高这句 ...

  4. 使用Freemarker导出Word文档(包含图片)代码实现及总结

    .personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); ...

  5. OpenResty Lua钩子调用完整流程

    前面一篇文章介绍了Openresty Lua协程调度机制,主要关心的是核心调度函数run_thread()内部发生的事情,而对于外部的事情我们并没有涉及.本篇作为其姊妹篇,准备补上剩余的部分.本篇将通 ...

  6. 授予mysql的其他用户数据库的使用权限

    场景:不同的开发人员有不同的数据库的权限:也可适用于外包公司不同的开发权限. root用户登录数据库,命令行执行下面语句即可. grant select,delete,update,create,dr ...

  7. 不同JDK版本的流异常处理

    1.JDK7以前的流异常try-catch处理 public static void main(String[] args) { FileInputStream fis = null; try { f ...

  8. bootstrap.yaml和application.yaml的区别

    bootstrap.yaml 配置一些引导系统启动的参数,这些参数一旦指定后就不会变动了.比如程序的端口号,配置中心的地址等. application.yaml 应用级别的参数配置,可能会根据业务需求 ...

  9. SQL 练习4

    查询不存在" 01 "课程但存在" 02 "课程的情况 SELECT * from sc WHERE cid = '02' AND sid not in (SE ...

  10. WPF学习笔记二 依赖属性实现原理及性能分析

    在这里讨论依赖属性实现原理,目的只是学习WPF是怎么设计依赖属性的,同时更好的使用依赖属性. 首先我们来思考一个简单的问题:我们希望能验证属性的值是否有效,属性变更时进行自己的处理.回顾一下.net的 ...