Controller接口还能这样玩,你会玩了吗?

开发 前端
当前环境使用了Spring Security。你可以直接在参数中获取SecurityContext对象,也可以获取当前安全上下文的任何关联对象,比如获取当前登录人的name或者获取角色信息等。

环境:SpringBoot3.2.5

1. 自己控制输出内容

接口参数可以直接使用OutputStream或Writer类型的参数,这样你的接口可以不用有任何的返回值,直接通过这2个对象进行输出内容,如下示例:

@GetMapping("/index")
public void index(OutputStream os, HttpServletResponse response) throws Exception {
  response.setContentType("text/plain;charset=utf-8") ;
  os.write("中国🇨🇳".getBytes()) ;
}

输出结果

图片图片

2. 自行读取请求body

当你需要自己解析处理请求body内容时,你可以将参数定义为InputStream或Reader类型,如下示例:

@PostMapping("/index")
public void index(InputStream is, HttpServletResponse response) throws Exception {
  response.setContentType("application/json;charset=utf-8") ;
  StringBuilder sb = new StringBuilder() ;
  String line = null ;
  InputStreamReader isr = new InputStreamReader(is, StandardCharsets.UTF_8) ;
  BufferedReader br = new BufferedReader(isr) ;
  while ((line = br.readLine()) != null) {
    sb.append(line) ;
  }
  response.getWriter().println(sb.toString()) ;
}

输出结果:

图片图片

3. 表达式参数

通常接口参数都是用来接收用户输入的数据,不过你还可以将参数值"固定"了,通过@Value注解来获取配置的数据信息,如下示例:

@GetMapping("/index")
public Object index(
  @Value("${pack.controller.params.version:}") String version) {
  return version ;
}

配置文件

pack:
  controller:
    params:
      version: 1.0.1

输出结果:

图片图片

即便请求参数中有version参数值也不会影响接口。

你甚至还可以使用SpEL表达式

@GetMapping("/spel")
public Object spel(@Value("#{systemProperties['java.home']}") String javaHome) {
  return javaHome ;
}

输出结果:

图片图片

4. body与header一起获取

如果你不仅要获取请求body还希望获取所有逇请求header信息,那么你可以将参数类型定义为HttpEntity类型,如下示例:

@PostMapping("/index")
public Object index(HttpEntity<User> entity) {
  System.out.printf("headers: %s%n", entity.getHeaders()) ;
  return entity.getBody() ;
}
public static record User(Long id, String name) {
}

请求:

图片图片

控制台输出:

图片图片

5. 从当前安全上下文中获取指定数据

这需要你当前环境使用了Spring Security。你可以直接在参数中获取SecurityContext对象,也可以获取当前安全上下文的任何关联对象,比如获取当前登录人的name或者获取角色信息等,如下示例:

@GetMapping("/name")
public Object name(
  @CurrentSecurityContext(expression = "authentication.name") String name) {
  return name ;
}

这里将获取当前登录用户的name属性值。

注:@CurrentSecurityContext注解从5.2版本才有的。

通过如下表达式还能获取当前的角色信息

@CurrentSecurityContext(expression = "authentication.authorities")

当然你也可以直接获取当前的上下文对象

@CurrentSecurityContext SecurityContext context

不添加表达式属性即可获取当前安全上下文对象。

图片图片

获取角色信息。

6. 特殊的Map参数

你可以在参数中直接定义Map集合对象;而它并非是从请求中获取所有的参数添加到Map,而是从模型属性中获取,如下示例:

// 由该注解来接收用户请求的参数
@ModelAttribute("user")
public User init(User user) {
  return user ;
}
@GetMapping("/index")
public Object index(Map<String, Object> map) {
  // 获取用户输入的参数
  return map.get("user") ;
}

输出结果

图片图片

这里Map填充的是由@ModelAttribute标注方法设置的值。

责任编辑:武晓燕 来源: Spring全家桶实战案例源码
相关推荐

2024-08-02 08:38:20

Controller接口地址

2020-11-16 13:38:31

PostMessage

2021-07-28 06:10:47

拖拽设计器 transmat

2021-09-05 07:55:37

前端Emoji 表情

2024-06-13 08:19:08

Controller接口参数

2017-03-07 09:49:18

存储

2021-04-09 08:23:30

Css前端加载动画

2018-12-12 11:30:54

JavaString字符串

2024-01-30 09:21:29

CSS文字效果文字装饰

2023-02-26 00:00:02

字符串分割String

2023-11-30 22:54:15

2020-05-22 10:00:08

数据库数据库设计软件设计

2022-04-11 08:20:36

编程辅助工具GitHubCopilot

2022-11-16 08:33:29

监听Spring监听器

2021-01-30 07:51:59

微信微信8.0腾讯

2023-04-06 06:55:24

ChatGPTGPT算力

2023-01-30 08:46:20

GoGo1兼容性

2016-12-28 14:51:46

大数据应用

2022-10-31 08:47:21

人脸识别按键键盘

2019-11-08 10:48:07

Windows操作系统微信Windows 10
点赞
收藏

51CTO技术栈公众号