• 获取 request 中用POST方式"Content-type"是"application/x-www-form-urlencoded;charset=utf-8"发送的 json 数据


    request中发送json数据用post方式发送Content-type用application/json;charset=utf-8方式发送的话,直接用springMVC的@RequestBody标签接收后面跟实体对象就行了,spring会帮你自动拼装成对象,如果Content-type设置成application/x-www-form-urlencoded;charset=utf-8就不能用spring的东西了,只能以常规的方式获取json串了

    方式一:通过流的方方式

    1. import java.io.IOException;
    2. import javax.servlet.http.HttpServletRequest;
    3. /**
    4. * request 对象的相关操作
    5. * @author zhangtengda
    6. * @version 1.0
    7. * @created 2015年5月2日 下午8:25:43
    8. */
    9. public class GetRequestJsonUtils {
    10. /***
    11. * 获取 request 中 json 字符串的内容
    12. *
    13. * @param request
    14. * @return : <code>byte[]</code>
    15. * @throws IOException
    16. */
    17. public static String getRequestJsonString(HttpServletRequest request)
    18. throws IOException {
    19. String submitMehtod = request.getMethod();
    20. // GET
    21. if (submitMehtod.equals("GET")) {
    22. return new String(request.getQueryString().getBytes("iso-8859-1"),"utf-8").replaceAll("%22", """);
    23. // POST
    24. } else {
    25. return getRequestPostStr(request);
    26. }
    27. }
    28. /**
    29. * 描述:获取 post 请求的 byte[] 数组
    30. * <pre>
    31. * 举例:
    32. * </pre>
    33. * @param request
    34. * @return
    35. * @throws IOException
    36. */
    37. public static byte[] getRequestPostBytes(HttpServletRequest request)
    38. throws IOException {
    39. int contentLength = request.getContentLength();
    40. if(contentLength<0){
    41. return null;
    42. }
    43. byte buffer[] = new byte[contentLength];
    44. for (int i = 0; i < contentLength;) {
    45. int readlen = request.getInputStream().read(buffer, i,
    46. contentLength - i);
    47. if (readlen == -1) {
    48. break;
    49. }
    50. i += readlen;
    51. }
    52. return buffer;
    53. }
    54. /**
    55. * 描述:获取 post 请求内容
    56. * <pre>
    57. * 举例:
    58. * </pre>
    59. * @param request
    60. * @return
    61. * @throws IOException
    62. */
    63. public static String getRequestPostStr(HttpServletRequest request)
    64. throws IOException {
    65. byte buffer[] = getRequestPostBytes(request);
    66. String charEncoding = request.getCharacterEncoding();
    67. if (charEncoding == null) {
    68. charEncoding = "UTF-8";
    69. }
    70. return new String(buffer, charEncoding);
    71. }
    72. }
    方式二:通过获取Map的方式处理

    这种刚方式存在弊端,如果json数据中存在=号,数据会在等号的地方断掉,后面的数据会被存储成map的values,需要重新拼装key和values的值,拼装成原来的json串

    1. /**
    2. * 方法说明 :通过获取map的方式
    3. */
    4. @SuppressWarnings("rawtypes")
    5. private String getParameterMap(HttpServletRequest request) {
    6. Map map = request.getParameterMap();
    7. String text = "";
    8. if (map != null) {
    9. Set set = map.entrySet();
    10. Iterator iterator = set.iterator();
    11. while (iterator.hasNext()) {
    12. Map.Entry entry = (Entry) iterator.next();
    13. if (entry.getValue() instanceof String[]) {
    14. logger.info("==A==entry的key: " + entry.getKey());
    15. String key = (String) entry.getKey();
    16. if (key != null && !"id".equals(key) && key.startsWith("[") && key.endsWith("]")) {
    17. text = (String) entry.getKey();
    18. break;
    19. }
    20. String[] values = (String[]) entry.getValue();
    21. for (int i = 0; i < values.length; i++) {
    22. logger.info("==B==entry的value: " + values[i]);
    23. key += "="+values[i];
    24. }
    25. if (key.startsWith("[") && key.endsWith("]")) {
    26. text = (String) entry.getKey();
    27. break;
    28. }
    29. } else if (entry.getValue() instanceof String) {
    30. logger.info("==========entry的key: " + entry.getKey());
    31. logger.info("==========entry的value: " + entry.getValue());
    32. }
    33. }
    34. }
    35. return text;
    36. }

    方式三:通过获取所有参数名的方式

    这种方式也存在弊端  对json串中不能传特殊字符,比如/=, =, /, ~等的这样的符号都不能有如果存在也不会读出来,他的模式和Map的方式是差不多的,也是转成Map处理的

    1. /**
    2. * 方法说明 :通过获取所有参数名的方式
    3. */
    4. @SuppressWarnings({ "rawtypes", "unchecked" })
    5. private String getParamNames(HttpServletRequest request) {
    6. Map map = new HashMap();
    7. Enumeration paramNames = request.getParameterNames();
    8. while (paramNames.hasMoreElements()) {
    9. String paramName = (String) paramNames.nextElement();
    10. String[] paramValues = request.getParameterValues(paramName);
    11. if (paramValues.length == 1) {
    12. String paramValue = paramValues[0];
    13. if (paramValue.length() != 0) {
    14. map.put(paramName, paramValue);
    15. }
    16. }
    17. }
    18. Set<Map.Entry<String, String>> set = map.entrySet();
    19. String text = "";
    20. for (Map.Entry entry : set) {
    21. logger.info(entry.getKey() + ":" + entry.getValue());
    22. text += entry.getKey() + ":" + entry.getValue();
    23. logger.info("text------->"+text);
    24. }
    25. if(text.startsWith("[") && text.endsWith("]")){
    26. return text;
    27. }
    28. return "";
    29. }


    附上一点常用的Content-type的方式

    application/x-javascript text/xml->xml数据 application/x-javascript->json对象 application/x-www-form-urlencoded->表单数据 application/json;charset=utf-8 -> json数据

    最后附上发送方式的连接

    http://blog.csdn.net/mingtianhaiyouwo/article/details/51381853





  • 相关阅读:
    CTF-cookies欺骗
    CTF-速度要快100
    php实现登录注册界面
    CTF-秋名山老司机 100
    三大类型语句
    PHP运算符
    标记风格和注释
    连接串口服务器时的注意事项
    RS485转以太网的概述和应用领域
    工业级路由器的优点有哪些
  • 原文地址:https://www.cnblogs.com/jpfss/p/10966352.html
Copyright © 2020-2023  润新知