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-EncodingKeep-AliveHeaders 的值:

@GetMapping("/demo")
public void handle(
        @RequestHeader("Accept-Encoding") String encoding, (1)
        @RequestHeader("Keep-Alive") long keepAlive) { (2)
    //...
}
  • (1) 获取Accept-EncodingHeaders 的值。
  • (2) 获取Keep-AliveHeaders 的值。

如果目标方法的参数类型不是String,则将自动应用类型转换。参见Type Conversion

Map<String, String>MultiValueMap<String, String>HttpHeaders参数上使用@RequestHeaderComments 时,将使用所有 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) 使用@SessionAttributesComments。

在第一个请求上,将名称为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)并且可能存在或可能不存在的预先存在的会话属性,则可以在方法参数上使用@SessionAttributeComments,作为以下示例显示:

@RequestMapping("/")
public String handle(@SessionAttribute User user) { (1)
    // ...
}
  • (1) 使用@SessionAttributeComments。

对于需要添加或删除会话属性的用例,请考虑将org.springframework.web.context.request.WebRequestjavax.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 的CorsConfigurationMap。但是,大多数应用程序使用 MVC Java 配置或 MVC XNM 命名空间来执行此操作。

默认情况下,全局配置启用以下功能:

  • All origins.
  • All headers.
  • GETHEADPOST方法。

默认情况下未启用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);
posted @ 2020-09-27 11:25  天宇轩-王  阅读(208)  评论(0编辑  收藏  举报