SpringMvc中几个注解
最近在回顾一下SSM,整理一下我用的不多的几个注解,下面都是从官网摘取下来的
@RequestHeader
您可以使用@RequestHeader
注解将请求 Headers 绑定到控制器中的方法参数。
考虑以下带有 Headers 的请求:
Host localhost:8080
Accept text/html,application/xhtml+xml,application/xml;q=0.9
Accept-Language fr,en-gb;q=0.7,en;q=0.3
Accept-Encoding gzip,deflate
Accept-Charset ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive 300
下面的示例获取Accept-Encoding
和Keep-Alive
Headers 的值:
@GetMapping("/demo")
public void handle(
@RequestHeader("Accept-Encoding") String encoding, (1)
@RequestHeader("Keep-Alive") long keepAlive) { (2)
//...
}
- (1) 获取
Accept-Encoding
Headers 的值。 - (2) 获取
Keep-Alive
Headers 的值。
如果目标方法的参数类型不是String
,则将自动应用类型转换。参见Type Conversion。
在Map<String, String>
,MultiValueMap<String, String>
或HttpHeaders
参数上使用@RequestHeader
Comments 时,将使用所有 Headers 值填充 Map。
内置支持可用于将逗号分隔的字符串转换为数组或字符串集合或类型转换系统已知的其他类型。例如,带有@RequestHeader("Accept")
Comments 的方法参数可以是String
类型,也可以是String[]
或List<String>
类型。
@CookieValue
您可以使用@CookieValue
注解将 HTTP cookie 的值绑定到控制器中的方法参数。
考虑带有以下 cookie 的请求:
JSESSIONID=415A4AC178C59DACE0B2C9CA727CDD84
以下示例显示如何获取 cookie 值:
@GetMapping("/demo")
public void handle(@CookieValue("JSESSIONID") String cookie) { (1)
//...
}
- (1) 获取
JSESSIONID
cookie 的值。
@ModelAttribute
您可以使用@ModelAttribute
注解:
- 在method argument in
@RequestMapping
方法中,从模型创建或访问Object
并将其通过WebDataBinder
绑定到请求。 - 作为
@Controller
或@ControllerAdvice
类中的方法级注解,可在任何@RequestMapping
方法调用之前帮助初始化模型。 - 在
@RequestMapping
方法上标记其返回值的是模型属性。
本节讨论@ModelAttribute
方法-前面列表中的第二项。控制器可以具有任意数量的@ModelAttribute
方法。所有此类方法均在同一控制器中的@RequestMapping
方法之前调用。 @ModelAttribute
方法也可以通过@ControllerAdvice
在控制器之间共享。有关更多详细信息,请参见Controller Advice部分。
@ModelAttribute
方法具有灵活的方法签名。它们支持与@RequestMapping
方法相同的许多参数,但@ModelAttribute
本身或与请求正文相关的任何东西除外。
以下示例显示了@ModelAttribute
方法:
@ModelAttribute
public void populateModel(@RequestParam String number, Model model) {
model.addAttribute(accountRepository.findAccount(number));
// add more ...
}
以下示例仅添加一个属性:
@ModelAttribute
public Account addAccount(@RequestParam String number) {
return accountRepository.findAccount(number);
}
如果未明确指定名称,则根据Object
类型选择默认名称,如Conventions的 javadoc 中所述。您始终可以通过使用重载的addAttribute
方法或通过@ModelAttribute
上的name
属性(用于返回值)来分配显式名称。
您也可以将@ModelAttribute
用作@RequestMapping
方法的方法级注解,在这种情况下@RequestMapping
方法的返回值将解释为模型属性。通常不需要这样做,因为这是 HTML 控制器中的默认行为,除非返回值是String
,否则它将被解释为视图名称。 @ModelAttribute
还可以自定义模型属性名称,如以下示例所示:
@GetMapping("/accounts/{id}")
@ModelAttribute("myAccount")
public Account handle() {
// ...
return account;
@SessionAttributes
@SessionAttributes
用于在请求之间的 HTTP Servlet 会话中存储模型属性。它是类型级别的注解,用于声明特定控制器使用的会话属性。这通常列出应透明地存储在会话中以供后续访问请求的模型属性名称或模型属性类型。
下面的示例使用@SessionAttributes
注解:
@Controller
@SessionAttributes("pet") (1)
public class EditPetForm {
// ...
}
- (1) 使用
@SessionAttributes
Comments。
在第一个请求上,将名称为pet
的模型属性添加到模型时,该属性会自动提升为 HTTP Servlet 会话并保存在该会话中。它会一直保留在那里,直到另一个控制器方法使用SessionStatus
方法参数来清除存储,如以下示例所示:
@Controller
@SessionAttributes("pet") (1)
public class EditPetForm {
// ...
@PostMapping("/pets/{id}")
public String handle(Pet pet, BindingResult errors, SessionStatus status) {
if (errors.hasErrors) {
// ...
}
status.setComplete(); (2)
// ...
}
}
}
- (1) 将
Pet
值存储在 Servlet 会话中。 - (2) 从 Servlet 会话中清除
Pet
值。
@SessionAttribute
如果您需要访问全局存在(例如,在控制器外部(例如,通过过滤器)Management)并且可能存在或可能不存在的预先存在的会话属性,则可以在方法参数上使用@SessionAttribute
Comments,作为以下示例显示:
@RequestMapping("/")
public String handle(@SessionAttribute User user) { (1)
// ...
}
- (1) 使用
@SessionAttribute
Comments。
对于需要添加或删除会话属性的用例,请考虑将org.springframework.web.context.request.WebRequest
或javax.servlet.http.HttpSession
注入控制器方法。
示例:
@Controller
@SessionAttributes(value = {"message"})
public class SessionAttributesController {
/**
* 往session域中存入数据
* 在没有SessionAttributes注解时,当控制器方法的参数有Model,ModelMap时是默认往请求域中存入数据
* @return
*/
@RequestMapping("/useSessionAttributes")
public String useSessionAttributes(Model model){
model.addAttribute("message","存入请求域的数据");
return "success";
}
@RequestMapping("/useSessionAttribute")
public String useSessionAttribute(HttpServletRequest request,@SessionAttribute(value = "message",required = false) String message){
System.out.println(message);
System.out.println("request attribute "+request.getAttribute("message"));
return "success";
}
}
@CrossOrigin
@CrossOriginComments 启用带注解 的控制器方法上的跨域请求,如以下示例所示:
@RestController
@RequestMapping("/account")
public class AccountController {
@CrossOrigin
@GetMapping("/{id}")
public Account retrieve(@PathVariable Long id) {
// ...
}
@DeleteMapping("/{id}")
public void remove(@PathVariable Long id) {
// ...
}
}
默认情况下,@CrossOrigin
允许:
- All origins.
- All headers.
- 控制器方法 Map 到的所有 HTTP 方法。
默认情况下未启用allowedCredentials
,因为它构建了一个信任级别,该级别公开了敏感的用户特定信息(例如 cookie 和 CSRF 令牌),仅应在适当的地方使用。
maxAge
设置为 30 分钟。
@CrossOrigin
在类级别也受支持,并且被所有方法继承,如以下示例所示:
@CrossOrigin(origins = "http://domain2.com", maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {
@GetMapping("/{id}")
public Account retrieve(@PathVariable Long id) {
// ...
}
@DeleteMapping("/{id}")
public void remove(@PathVariable Long id) {
// ...
}
}
您可以在类级别和方法级别使用@CrossOrigin
,如以下示例所示:
@CrossOrigin(maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {
@CrossOrigin("http://domain2.com")
@GetMapping("/{id}")
public Account retrieve(@PathVariable Long id) {
// ...
}
@DeleteMapping("/{id}")
public void remove(@PathVariable Long id) {
// ...
}
}
全局配置
除了细粒度的控制器方法级别配置之外,您可能还想定义一些全局 CORS 配置。您可以在任何HandlerMapping
上分别设置基于 URL 的CorsConfiguration
Map。但是,大多数应用程序使用 MVC Java 配置或 MVC XNM 命名空间来执行此操作。
默认情况下,全局配置启用以下功能:
- All origins.
- All headers.
GET
,HEAD
和POST
方法。
默认情况下未启用allowedCredentials
,因为它构建了一个信任级别,该级别公开了敏感的用户特定信息(例如 cookie 和 CSRF 令牌),仅应在适当的地方使用。
maxAge
设置为 30 分钟。
Java Configuration
要在 MVC Java 配置中启用 CORS,可以使用CorsRegistry
回调,如以下示例所示:
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**")
.allowedOrigins("http://domain2.com")
.allowedMethods("PUT", "DELETE")
.allowedHeaders("header1", "header2", "header3")
.exposedHeaders("header1", "header2")
.allowCredentials(true).maxAge(3600);
// Add more mappings...
}
}
XML Configuration
要在 XML 名称空间中启用 CORS,可以使用<mvc:cors>
元素,如以下示例所示:
<mvc:cors>
<mvc:mapping path="/api/**"
allowed-origins="http://domain1.com, http://domain2.com"
allowed-methods="GET, PUT"
allowed-headers="header1, header2, header3"
exposed-headers="header1, header2" allow-credentials="true"
max-age="123" />
<mvc:mapping path="/resources/**"
allowed-origins="http://domain1.com" />
</mvc:cors>
CORS 过滤器
要配置过滤器,请将CorsConfigurationSource
传递给其构造函数,如以下示例所示:
CorsConfiguration config = new CorsConfiguration();
// Possibly...
// config.applyPermitDefaultValues()
config.setAllowCredentials(true);
config.addAllowedOrigin("http://domain1.com");
config.addAllowedHeader("*");
config.addAllowedMethod("*");
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", config);
CorsFilter filter = new CorsFilter(source);