返回顶部
首页 > 资讯 > 精选 >如何解决Spring MVC接口漏洞百出
  • 205
分享到

如何解决Spring MVC接口漏洞百出

2023-06-16 03:06:09 205人浏览 泡泡鱼
摘要

这篇文章主要介绍“如何解决spring mvc接口漏洞百出”,在日常操作中,相信很多人在如何解决Spring MVC接口漏洞百出问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何解决Spring MVC接口漏

这篇文章主要介绍“如何解决spring mvc接口漏洞百出”,在日常操作中,相信很多人在如何解决Spring MVC接口漏洞百出问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何解决Spring MVC接口漏洞百出”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

1. 前言

在开始前请务必确认添加了Spring Boot Test相关的组件,在最新的版本中应该包含以下依赖:

<dependency>     <groupId>org.springframework.boot</groupId>     <artifactId>spring-boot-starter-test</artifactId>     <scope>test</scope>     <exclusions>         <exclusion>             <groupId>org.junit.vintage</groupId>             <artifactId>junit-vintage-engine</artifactId>         </exclusion>     </exclusions> </dependency>

2. 单独测试控制层

如果我们只需要对控制层接口(Controller)进行测试,且该接口不依赖@Service、@Component等注解声明的 Spring Bean  时,可以借助@WEBMvcTest来启用只针对 Web 控制层的测试,例如

@WebMvcTest class CustomSpringInjectApplicationTests {     @Autowired     MockMvc mockMvc;      @SneakyThrows     @Test     void contextLoads() {         mockMvc.perfORM(MockMvcRequestBuilders.get("/foo/map"))                 .andExpect(ResultMatcher.matchAll(status().isOk(),                         content().contentType(MediaType.APPLICATION_JSON),                         jsonPath("$.test", Is.is("hello"))))                 .andDo(MockMvcResultHandlers.print());     }  }

这种方式要快的多,它只加载了应用程序的一小部分。但是如果你涉及到服务层这种方式是不凑效的,我们就需要整体测试了方了。

3. 整体测试

大多数 Spring Boot 下的接口测试是整体而又全面的测试,涉及到控制层、服务层、持久层等方方面面,所以需要加载比较完整的 Spring Boot  上下文。这时我们可以这样做,声明一个抽象的测试基类:

package cn.felord.custom;  import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.web.servlet.MockMvc;    @SpringBootTest @AutoConfigureMockMvc abstract class CustomSpringInjectApplicationTests {          @Autowired     MockMvc mockMvc;     // 其它公共依赖和处理方法 }

只有当@AutoConfigureMockMvc存在时MockMvc才会被注入 Spring ioc

然后针对具体的控制层进行如下测试代码的编写:

package cn.felord.custom;  import lombok.SneakyThrows; import org.hamcrest.core.Is; import org.junit.jupiter.api.Test; import org.springframework.Http.MediaType; import org.springframework.test.web.servlet.ResultMatcher; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.result.MockMvcResultHandlers;  import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;   public class FooTests extends CustomSpringInjectApplicationTests {          @SneakyThrows     @Test     void contextLoads() {         mockMvc.perform(MockMvcRequestBuilders.get("/foo/map"))                 .andExpect(ResultMatcher.matchAll(status().isOk(),                         content().contentType(MediaType.APPLICATION_JSON),                         jsonPath("$.test", Is.is("bar"))))                 .andDo(MockMvcResultHandlers.print());     } }

4. MockMvc 测试

集成测试时,希望能够通过输入 URL 对 Controller 进行测试,如果通过启动服务器,建立 http client  进行测试,这样会使得测试变得很麻烦,比如,启动速度慢,测试验证不方便,依赖网络环境等,为了可以对 Controller  进行测试,所以引入了MockMvc。

MockMvc实现了对 Http 请求的模拟,能够直接使用网络的形式,转换到 Controller  的调用,这样可以使得测试速度快、不依赖网络环境,而且提供了一套验证的工具,这样可以使得请求的验证统一而且很方便。接下来我们来一步步构造一个测试的模拟请求,假设我们存在一个下面这样的接口:

@RestController @RequestMapping("/foo") public class FooController {     @Autowired     private MyBean myBean;      @GetMapping("/user")     public Map<String, String> bar(@RequestHeader("Api-Version") String apiVersion, User user) {         Map<String, String> map = new HashMap<>();         map.put("test", myBean.bar());         map.put("version", apiVersion);         map.put("username", user.getName());         //todo your business         return map;     } }

参数设定为name=felord.cn&age=18,那么对应的 HTTP 报文是这样的:

GET /foo/user?name=felord.cn&age=18 HTTP/1.1 Host: localhost:8888 Api-Version: v1

可以预见的返回值为:

{     "test": "bar",     "version": "v1",     "username": "felord.cn" }

事实上对接口的测试可以分为以下几步。

构建请求

构建请求由MockMvcRequestBuilders负责,他提供了请求方法(Method),请求头(Header),请求体(Body),参数(Parameters),会话(Session)等所有请求的属性构建。/foo/user接口的请求可以转换为:

MockMvcRequestBuilders.get("/foo/user")                 .param("name", "felord.cn")                 .param("age", "18")                 .header("Api-Version", "v1")

执行 Mock 请求

然后由MockMvc执行 Mock 请求:

mockMvc.perform(MockMvcRequestBuilders.get("/foo/user")                 .param("name", "felord.cn")                 .param("age", "18")                 .header("Api-Version", "v1"))

对结果进行处理

请求结果被封装到ResultActions对象中,它封装了多种让我们对 Mock 请求结果进行处理的方法。

对结果进行预期期望

ResultActions#andExpect(ResultMatcher  matcher)方法负责对响应的结果的进行预期期望,看看是否符合测试的期望值。参数ResultMatcher负责从响应对象中提取我们需要期望的部位进行预期比对。

假如我们期望接口/foo/user返回的是JSON,并且 HTTP 状态为200,同时响应体包含了version=v1的值,我们应该这么声明:

ResultMatcher.matchAll(MockMvcResultMatchers.status().isOk(),                MockMvcResultMatchers.content().contentType(MediaType.APPLICATION_JSON),                MockMvcResultMatchers.jsonPath("$.version", Is.is("v1")));

JsonPath是一个强大的 JSON 解析类库,请通过其项目仓库https://GitHub.com/json-path/JsonPath了解。

对响应进行处理

ResultActions#andDo(ResultHandler handler)方法负责对整个请求/响应进行打印或者 log  输出、流输出,由MockMvcResultHandlers工具类提供这些方法。我们可以通过以上三种途径来查看请求响应的细节。

例如/foo/user接口:

MockHttpServletRequest:       HTTP Method = GET       Request URI = /foo/user        Parameters = {name=[felord.cn], age=[18]}           Headers = [Api-Version:"v1"]              Body = null     Session Attrs = {}  Handler:              Type = cn.felord.xbean.config.FooController            Method = cn.felord.xbean.config.FooController#urlEncode(String, Params)  Async:     Async started = false      Async result = null  Resolved Exception:              Type = null  ModelAndView:         View name = null              View = null             Model = null  FlashMap:        Attributes = null  MockHttpServletResponse:            Status = 200     Error message = null           Headers = [Content-Type:"application/json"]      Content type = application/json              Body = {"test":"bar","version":"v1","username":"felord.cn"}     Forwarded URL = null    Redirected URL = null           Cookies = []

获取返回结果

如果你希望进一步处理响应的结果,也可以通过ResultActions#andReturn()拿到MvcResult类型的结果进行进一步的处理。

完整的测试过程

通常andExpect是我们必然会选择的,而andDo和andReturn在某些场景下会有用,它们两个是可选的。我们把上面的连在一起。

@Autowired MockMvc mockMvc;  @SneakyThrows @Test void contextLoads() {       mockMvc.perform(MockMvcRequestBuilders.get("/foo/user")             .param("name", "felord.cn")             .param("age", "18")             .header("Api-Version", "v1"))             .andExpect(ResultMatcher.matchAll(status().isOk(),                     content().contentType(MediaType.APPLICATION_JSON),                     jsonPath("$.version", Is.is("v1"))))             .andDo(MockMvcResultHandlers.print());  }

这种流式的接口单元测试从语义上看也是比较好理解的,你可以使用各种断言、正例、反例测试你的接口,最终让你的接口更加健壮。

到此,关于“如何解决Spring MVC接口漏洞百出”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: 如何解决Spring MVC接口漏洞百出

本文链接: https://lsjlt.com/news/282179.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何解决Spring MVC接口漏洞百出
    这篇文章主要介绍“如何解决Spring MVC接口漏洞百出”,在日常操作中,相信很多人在如何解决Spring MVC接口漏洞百出问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何解决Spring MVC接口漏...
    99+
    2023-06-16
  • VMware ESXi OpenSLP堆溢出漏洞如何解决
    这篇文章主要介绍“VMware ESXi OpenSLP堆溢出漏洞如何解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“VMware ESXi OpenSLP...
    99+
    2023-07-05
  • php漏洞如何解决
    要解决PHP漏洞,可以采取以下措施:1. 及时更新PHP版本:及时升级到最新的PHP版本,因为新的版本通常会修复已知的漏洞。2. 及...
    99+
    2023-09-06
    php
  • rdp高危漏洞如何解决
    修复rdp高危漏洞的方法首先,在计算机中右键点击“开始”,选择打开“控制板面”;进入到控制版面后,在控制版面中进入“Windows Update” 选项;在弹出的Windows Update界面中,点击“检查更新”选项;最后,等待检查更新完...
    99+
    2024-04-02
  • 织梦系统漏洞如何解决
    解决织梦系统漏洞的方法有以下几种将data、templets、uploads、a目录设置为可读写不可执行权限。将include、member、plus、dede目录设置为可读可执行不可写入权限。连接Mysql数据库时避免使用root用户进行...
    99+
    2024-04-02
  • Spring MVC如何实现接口Controller定义控制器
    目录实现接口Controller定义控制器方法一:实现接口Controller定义控制器方法二:使用注解@Controller定义控制器详谈Controller(控制器)一、cont...
    99+
    2024-04-02
  • 如何解决SQL注入漏洞问题
    本篇内容介绍了“如何解决SQL注入漏洞问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!前言最近我在整理安...
    99+
    2024-04-02
  • PHP代码执行漏洞如何解决
    要解决PHP代码执行漏洞,可以考虑以下几个方面的措施:1. 输入验证和过滤:对于用户输入的数据,进行验证和过滤,确保输入的数据符合预...
    99+
    2023-09-27
    PHP
  • Spring Mvc中对象的参数出现重名如何解决
    Spring Mvc中对象的参数出现重名如何解决?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。发现问题SpringMvc提供了对象参数绑定功能,例如Person对象有一个age...
    99+
    2023-05-31
    springmvc 中对
  • url存在sql注入漏洞如何解决
    url存在sql注入漏洞的解决方法:使用拦截器进行对request的host进行了验证,例如:package com.XXX.interceptoer;import com.jfinal.aop.Interceptor;import com...
    99+
    2024-04-02
  • 织梦网站漏洞如何解决办法
    织梦网站漏洞的解决办法:删除install安装目录。定期进行备份网站目录和数据库,并在后台进行文件校验、病毒扫描、系统错误修复。在dedecms的后台更新补丁,升级为最新版本。将以下目录:data、templets、uploads、a设置可...
    99+
    2024-04-02
  • 网站跨站脚本漏洞如何解决
    网站跨站脚本漏洞的解决方法:对用户输入的数据进行全面的安全过滤。对get、post、cookies进行安全效验。对一些非法的参数,像、",'等进行自动转义或者强制拦截并提示。过滤双引号、分号、单引号以及对字符进行HTML实体编码操作。网站发...
    99+
    2024-04-02
  • 电脑漏洞修复不了如何解决
    如果你的电脑出现了漏洞修复不了的问题,可以尝试以下解决方法:1. 安装最新的操作系统和软件更新:确保你的电脑上安装了最新的操作系统补...
    99+
    2023-09-01
    电脑
  • Spring接口方法加@Transactional失效如何解决
    这篇文章主要介绍了Spring接口方法加@Transactional失效如何解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Spring接口方法加@Transactional失效如何解决文章都会有所收获,下面...
    99+
    2023-07-05
  • 如何解决写接口出现的问题
    这篇文章主要介绍“如何解决写接口出现的问题”,在日常操作中,相信很多人在如何解决写接口出现的问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何解决写接口出现的问题”的疑惑...
    99+
    2024-04-02
  • ASP 日志 api 接口:如何避免常见的错误和漏洞?
    ASP 日志 API 接口是一个强大的工具,可以帮助开发人员更好地管理和监控他们的应用程序。但是,如果不小心使用,就可能会导致常见的错误和漏洞。本文将介绍如何避免这些问题,并提供一些示例代码。 使用 HTTPS 如果您的应用程序使用 A...
    99+
    2023-06-19
    日志 api 接口
  • spring mvc无法支持事务控制如何解决
    这篇文章将为大家详细讲解有关spring mvc无法支持事务控制如何解决,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。spring-mybatis.xml 配置<bean id=&qu...
    99+
    2023-05-31
    springmvc 事务控制
  • 使用Spring MVC如何调用支付宝接口完成在线支付
    本篇文章为大家展示了使用Spring MVC如何调用支付宝接口完成在线支付,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。第一步:完善沙箱信息 进入支付宝的开发者中心 就可以看到有个沙箱环境...
    99+
    2023-05-31
    springmvc
  • java中出现内存泄漏如何解决
    java中出现内存泄漏如何解决?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Java有哪些集合类Java中的集合主要分为四类:1、List列表:有序的,可重复的...
    99+
    2023-06-14
  • Java中出现内存泄漏与溢出如何解决
    这篇文章将为大家详细讲解有关Java中出现内存泄漏与溢出如何解决,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、浅析内存泄露( memory leak):是指程序在申请内存后,无法释放已申...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作