问题:
测试接口发送请求时后端报错:org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Unexpected end-of-input: expected close marker for Object (start marker at [Source: (PushbackInputStream); line: 1, column: 1]); nested exception is com.fasterxml.jackson…
出现这个错误的时候postman传的参数格式是这样子的:
后端代码接收参数是:
分析:
因为其实这个接口传送的方式是Form表单方式的,而且使用到了@ApiImplicitParam,若有多个参数的话使用@ApiImplicition进行包裹,接收x-www-form-urlencoded类型的关键点就在于@ApiImplicitParam。免去了使用@RequestBody在写一个接收类的繁琐步骤,加上@ApiImplicitParam之后直接接收即可。Form表单方式在Body选项卡中选择x-www-form-urlencoded格式,然后在键值对中填写参数,例如:
name=John
age=30
有关x-www-form-urlencoded格式和json格式的区别,请参考博文
解决方法:
postman发送请求body变成x-www-form-urlencoded格式,详情查看链接: 详情
后端接收方式修改为ModelAttribute
另:
如果报错XssHttpServletRequestWrapper 接口不符合XSS规则时,也就是你发送的参数是html标签的时候会被认为是XSS攻击,在跨站脚本(XSS)攻击中,攻击者可以在受害者的浏览器中执行恶意脚本。这种攻击通常是通过在网页中插入恶意代码 (JavaScript) 来完成的。攻击者在使用攻击后一般能够:
- 修改网页内容
- 将用户重定向到其他网站
- 访问用户的 Cookie 并利用此信息来冒充用户
- 访问有关用户系统的关键信息,例如地理位置,网络摄像头,文件系统
- 将木马功能注入应用程序
如果被攻击的用户在应用程序中具有更高的权限。攻击者可以完全控制应用程序,并破坏所有用户及其数据。
常见的 XSS 攻击主要有三种:存储型 XSS 攻击,反射型 XSS 攻击和 DOM-based 型 XSS 攻击。
- 存储型主要是将 XSS 代码保存在服务端(数据库、文件系统等),当用户以后再次请求该资源时重新解析该 XSS 代码,从而出现攻击。
- 反射型主要发生在一个应用程序使用动态页面向用户显示错误消息时,如果消息中注入了恶意代码就会造成 XSS 反射型攻击。
- DOM-based 主要是通过脚本直接修改客户端的 DOM 结构,一般这种都是属于前端 JavaScript 的漏洞。
所以避免 XSS 攻击最有效的办法就是对用户输入的数据进行转义,然后存储到数据库里面。等到视图层渲染 HTML 页面的时候。转义后的文字是不会被当做 JavaScript 执行的,这就可以抵御 XSS攻击。
即在web配置文件中配置XssFilter
${ms.xss.filterUrl}是在appclication.yml配置文件中设置的
webconfig文件中
//XSS过滤器
@Bean
public FilterRegistrationBean xssFilterRegistration(@Value("${ms.xss.xssEnable:false}") boolean xssEnable,
@Value("${ms.xss.filterUrl}") String filterUrl,
@Value("${ms.xss.excludeUrl}") String excludeUrl) {
XSSEscapeFilter xssFilter = new XSSEscapeFilter();
Map<String, String> initParameters = new HashMap();
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setName("XSSFilter");
registration.addUrlPatterns(new String[]{"/*"});
registration.setOrder(-2147483648);
xssFilter.includes.add("/**");
xssFilter.excludes.add(MSProperties.manager.path + "/**");
if (filterUrl != null && StrUtil.isNotBlank(filterUrl.toString())) {
xssFilter.includes.addAll(Arrays.asList(filterUrl.toString().split(",")));
}
if (excludeUrl != null && StrUtil.isNotBlank(excludeUrl.toString())) {
xssFilter.excludes.addAll(Arrays.asList(excludeUrl.toString().split(",")));
}
initParameters.put("isIncludeRichText", "false");
registration.setInitParameters(initParameters);
registration.setFilter(xssFilter);
registration.setEnabled(xssEnable);
return registration;
}