Spring MVC:需要优雅的解决方案来处理传递到前端的字符串的转义和取消转义



我正在使用Spring MVC构建一个Web应用程序。该应用程序涉及从数据库中获取包含字符串作为属性的多个对象。我无法控制输入数据库的这些字符串的格式。

我遇到了一个问题,当带有引号的字符串("和"(作为 JSON 对象的属性传递到 JavaScript 时,它们不会被识别为字符串的一部分,因此它们关闭了它们所属字符串的引号。我通过在包装器函数中对从数据库获取的每个字符串调用 JavaScriptUtils.javaScriptEscape(( 函数来解决此问题。

这修复了 JavaScript 错误,但现在我遇到了一个问题,即当网页上显示相同的字符串时,包含转义字符"\"(即"显示为 \" 等(。我现在的要求如下:

  1. 需要一个函数将这些字符串"取消转义"回正常形式,以便它们按预期工作

  2. 需要一种方法将所述函数应用于提取到前端的所有字符串。对每个 AJAX 调用中获取的每个 JSON 对象的每个属性单独调用此函数太痛苦了。由于将来将向应用程序添加更多功能,因此解决方案最好是不需要硬编码到每个 AJAX 请求中的解决方案。

  3. 需要一种更好的方法来将此转义应用于从数据库获取的对象。现在,我有一个单独的函数,它转义了每个对象中的字符串,但问题是每次获取新类型的对象时,我都需要定义一个新函数。

我想知道是否有办法让Spring MVC自动处理这个问题,因为这似乎是大多数开发人员在某个时候会面临的问题。任何有助于让我更轻松的建议,不胜感激!

编辑:

这是对从数据库获取的每个字符串调用的函数:

String EscapeJS(String string)
{
string = JavaScriptUtils.javaScriptEscape(string);
return string;
}

以下是返回对象的方式:

@RequestMapping(value = "/urlToController", method = RequestMethod.POST)
public ResponseEntity<Object> returnObject(@RequestBody String option)
{
Object object = wrapperFunction(fetchObjectFromBackend(option));
return new ResponseEntity<>(object, HttpStatus.OK);
}

在这里,'wrapperFunction((' 使用 EscapeJS(( 转换对象内的所有字符串。

这是一个 AJAX 调用:

$.ajax({
type: "POST",
headers:
{
'Accept': 'application/json',
'Content-Type': 'application/json'
},
url: '/urlToController',
data: option,
success: function(returnedObject)
{
console.log(returnedObject);
},
error : function(dataString)
{
alert("AJAX Call failed");
console.log(dataString);
}
});

有几种方法可以使字符串转义更通用。最强大和最先进的方法是创建自定义 ObjectMapper,您可以在其中处理您想要执行的所有不同转义和设置。然后,如果您使用 Spring 注册该 ObjectMapper,您将完全控制 json 的生成方式。对于Spring MVC,请参阅此处的示例:

http://magicmonster.com/kb/prg/java/spring/webmvc/jackson_custom.html

对于 Spring 启动,它更容易一些: 在 Spring 中配置 ObjectMapper

另一个功能稍弱但可能更容易的选项是创建一个包装器对象,该对象仅管理作为 bean 一部分的字符串转义。所以改变这个:

Object object = wrapperFunction(fetchObjectFromBackend(option));
return new ResponseEntity<>(object, HttpStatus.OK);

像这样:

Object object = wrapperFunction(fetchObjectFromBackend(option));
//The wrapper would make the escape calls needed and have a single property to 
//return the escaped string for you
MyWrapper wrapped = new MyWrapper(object);
return new ResponseEntity<>(wrapped, HttpStatus.OK);

MyWrapper 的构造函数对数据执行任何您需要执行的操作。如果愿意,您也可以直接返回转义的字符串:

return new ResponseEntity<>(wrapped.getEscapedString(), HttpStatus.OK);

ObjectMapper可能是更好的长期使用方式,但它取决于您的系统和计划的设置。

最新更新