小言_互联网的博客

React 集成jsoneditor后,password格式保护json数据的敏感信息

326人阅读  评论(0)

目录

1.集成jsoneditor到React

2.修改代码

(1).添加Option

(2).修改Node.js文件

(3).修改util.js文件


1.集成jsoneditor到React

关于怎样将jsoneditor集成到React中,请参考文章:https://blog.csdn.net/wdquan19851029/article/details/115869264,本文只讲怎样修改jsoneditor源码,使用password格式保护json敏感信息。

从github下载源代码:https://github.com/josdejong/jsoneditor

2.修改代码

我们得考虑,真正使用的时候,我们一般只是需要保护部分敏感信息,没有必要保护所有信息,那样根本什么信息都看不到,所以我们只考虑保护部分信息。

看我们的json数据,其中有需要保护的数据 "sensitive-data".


  
  1. const initialJson = {
  2. "Array": [ 1, 2, 3],
  3. "Boolean": true,
  4. "Null": null,
  5. "Number": 123,
  6. "Object": { "a": "b", "c": "d"},
  7. "MultiLevel":{
  8. "multi":{
  9. "e": "f",
  10. "h": "h"
  11. }
  12. },
  13. "String": "Hello World",
  14. "sensitive-data": {
  15. "sensitive1": "sensitive1",
  16. "sensitive2": "sensitive2",
  17. "sensitive3": "sensitive3"
  18. }
  19. }

(1).添加Option

需要保护的信息,我们设计以option的形式传进去。我们自己添加一个新的参数sensitiveDataLabel ,设置其值为"sensitive-data"


  
  1. const options = {
  2. mode: 'tree',
  3. sensitiveDataLabel: 'sensitive-data',
  4. onChangeJSON: (data)=>{
  5. console.log( 'JSONeditor:change:',data);}
  6. }

(2).修改Node.js文件

然后修改Node.js的_createDomValue ()函数:其中注释为"新增的代码",是我做的修改,主要是判断parent node的name是不是与我们传进来的option sensitiveDataLabel 相等,如果相等,那么就创建一个input标签,type为password,用来保护敏感信息。


  
  1. /**
  2. * Create an editable value
  3. * @private
  4. */
  5. _createDomValue () {
  6. let domValue
  7. if ( this.type === 'array') {
  8. domValue = document.createElement( 'div')
  9. domValue.textContent = '[...]'
  10. } else if ( this.type === 'object') {
  11. domValue = document.createElement( 'div')
  12. domValue.textContent = '{...}'
  13. } else {
  14. if (! this.editable.value && isUrl( this.value)) {
  15. // create a link in case of read-only editor and value containing an url
  16. domValue = document.createElement( 'a')
  17. domValue.href = this.value
  18. domValue.innerHTML = this._escapeHTML( this.value)
  19. } else {
  20. // create an editable or read-only div
  21. //新增的代码
  22. let isSensitiveData = false
  23. if( this.parent) {
  24. let sensitiveDataLabel = ""
  25. if( this.editor.options.sensitiveDataLabel) sensitiveDataLabel = this.editor.options.sensitiveDataLabel
  26. if( this.parent.getName() && this.parent.getName() == sensitiveDataLabel){
  27. isSensitiveData = true
  28. }
  29. }
  30. if(isSensitiveData){
  31. //新增的代码
  32. domValue = document.createElement( 'input')
  33. domValue.type = "password"
  34. domValue.placeholder= ""
  35. domValue.contentEditable = this.editable.value
  36. domValue.spellcheck = false
  37. domValue.value = this._escapeHTML( this.value)
  38. } else{
  39. domValue = document.createElement( 'div')
  40. domValue.contentEditable = this.editable.value
  41. domValue.spellcheck = false
  42. domValue.innerHTML = this._escapeHTML( this.value)
  43. }
  44. }
  45. }
  46. return domValue
  47. }

重新编译源代码,并导入React工程之后,可以看到效果:

(3).修改util.js文件

但是当进行修改的时候,发现修改无效,头疼,继续修改代码,修改util.js文件中的getInnerText (element, buffer)函数。

注释为"新增的代码"部分,就是我做的修改,将用户在上面界面的修改,赋给child这个Node,因为以前都是用<div>标签去显示value,现在改成了<input>,按照以前的方式,是用innerHTML属性获取值,但是现在需要使用value属性去获取值。


  
  1. export function getInnerText (element, buffer) {
  2. const first = (buffer === undefined)
  3. if (first) {
  4. buffer = {
  5. _text: '',
  6. flush: function () {
  7. const text = this._text
  8. this._text = ''
  9. return text
  10. },
  11. set: function (text) {
  12. this._text = text
  13. }
  14. }
  15. }
  16. // text node
  17. //console.log("Debug: getInnerText() -> element.nodeValue : " + element.nodeValue)
  18. if (element.nodeValue) {
  19. // remove return characters and the whitespace surrounding return characters
  20. const trimmedValue = element.nodeValue.replace( /\s*\n\s*/g, '')
  21. if (trimmedValue !== '') {
  22. return buffer.flush() + trimmedValue
  23. } else {
  24. // ignore empty text
  25. return ''
  26. }
  27. }
  28. // divs or other HTML elements
  29. if (element.hasChildNodes()) {
  30. const childNodes = element.childNodes
  31. let innerText = ''
  32. for ( let i = 0, iMax = childNodes.length; i < iMax; i++) {
  33. const child = childNodes[i]
  34. //新增的代码
  35. if(element.type == "password" && element.value){
  36. child.nodeValue = element.value;
  37. }
  38. if (child.nodeName === 'DIV' || child.nodeName === 'P') {
  39. const prevChild = childNodes[i - 1]
  40. const prevName = prevChild ? prevChild.nodeName : undefined
  41. if (prevName && prevName !== 'DIV' && prevName !== 'P' && prevName !== 'BR') {
  42. if (innerText !== '') {
  43. innerText += '\n'
  44. }
  45. buffer.flush()
  46. }
  47. innerText += getInnerText(child, buffer)
  48. buffer.set( '\n')
  49. } else if (child.nodeName === 'BR') {
  50. innerText += buffer.flush()
  51. buffer.set( '\n')
  52. } else {
  53. innerText += getInnerText(child, buffer)
  54. }
  55. }
  56. return innerText
  57. }
  58. // br or unknown
  59. return ''
  60. }

 


转载:https://blog.csdn.net/wdquan19851029/article/details/115872192
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场