@RequestHeader头部验证用户身份案例

@RequestHeader 注解,它用于将 HTTP 请求的头部信息注入到控制器方法的参数中。这个功能在处理需要根据请求头部来做决策的业务逻辑时非常有用,例如,根据用户的 Accept 头部返回不同格式的响应,或者根据 Authorization 头部验证用户身份。

注解设计结构

业务场景:

例如开发一个 RESTful API,该 API 需要根据客户端请求的 Accept 头部来返回 JSON 或 XML 格式的响应。此外,还需要根据 Authorization 头部验证用户身份。

1. 根据 Accept 头部返回不同格式的响应:

Java 复制代码
import org.springframework.web.bind.annotation.*;
import org.springframework.http.MediaType;

@RestController
public class ProductController {

    @GetMapping("/products")
    public ResponseEntity<Product> getProducts(@RequestHeader(value = "Accept", required = false) String acceptHeader) {
        Product product = productService.getProduct();

        if (MediaType.APPLICATION_XML_VALUE.equalsIgnoreCase(acceptHeader)) {
            return ResponseEntity.ok().contentType(MediaType.APPLICATION_XML).body(product);
        } else {
            return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(product);
        }
    }
}

在这个例子中,@RequestHeader 注解用于获取 Accept 头部的值,并根据该值返回不同格式的响应。

2. 验证 Authorization 头部:

java 复制代码
public class SecurityInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        String authorizationHeader = request.getHeader("Authorization");
        if (authorizationHeader == null || !authorizationService.validateToken(authorizationHeader)) {
            response.setStatus(HttpStatus.UNAUTHORIZED.value());
            return false;
        }
        return true;
    }
}

在这个安全拦截器中,我们使用 HttpServletRequestgetHeader 方法来获取 Authorization 头部的值,并验证它是否有效。

3. 注册拦截器:

java 复制代码
@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new SecurityInterceptor());
    }
}

4. 客户端请求:

客户端在发送请求时,需要在请求头部中包含 AcceptAuthorization

注解属性说明

@RequestHeader 注解的属性说明:

  1. value:

    • 类型:String
    • 作用:指定要提取的 HTTP 请求头部的名称。这是必需的属性。
  2. name:

    • 类型:String
    • 作用:提供用于绑定的参数名称,如果指定,将使用此名称而不是 value 属性的值。这在你想要将请求头部名称与方法参数名称区分开来时非常有用。
  3. defaultValue:

    • 类型:String
    • 作用:指定一个默认值,如果在请求中没有找到指定的请求头部,或者请求头部的值为空字符串,则使用此默认值。如果没有指定默认值,且请求头部不存在或为空,则注入 null
  4. required:

    • 类型:boolean
    • 默认值:true
    • 作用:指示是否必须在请求中找到指定的请求头部。如果设置为 true(默认值),则必须存在具有指定名称的请求头部,否则将抛出异常。如果设置为 false,则在找不到请求头部时注入 nulldefaultValue(如果有的话)。

总结:

  • @RequestHeader 注解允许开发者访问 HTTP 请求的头部信息,并根据这些信息来处理业务逻辑。
  • 它提供了一种灵活的方式来处理基于请求头部的决策,例如响应格式的协商或安全验证。
  • 使用 @RequestHeader 注解可以提高代码的可读性和可维护性,尤其是在处理复杂的请求头部逻辑时。
相关推荐
JELEE.3 分钟前
Django登录注册完整代码(图片、邮箱验证、加密)
前端·javascript·后端·python·django·bootstrap·jquery
学到头秃的suhian3 小时前
Maven
java·maven
QX_hao3 小时前
【Go】--反射(reflect)的使用
开发语言·后端·golang
小坏讲微服务3 小时前
Docker-compose 搭建Maven私服部署
java·spring boot·后端·docker·微服务·容器·maven
chxii3 小时前
Maven 详解(下)
java·maven
inferno3 小时前
Maven基础(二)
java·开发语言·maven
杨武博3 小时前
关于maven中pom依赖冲突问题记录
java·maven
yuuki2332333 小时前
【数据结构】用顺序表实现通讯录
c语言·数据结构·后端
你的人类朋友4 小时前
【Node】手动归还主线程控制权:解决 Node.js 阻塞的一个思路
前端·后端·node.js
史不了4 小时前
静态交叉编译rust程序
开发语言·后端·rust