Java请求接收流程如何规范

wen java案例 31

本文目录导读:

Java请求接收流程如何规范

  1. 整体流程概览
  2. 各环节规范详解
  3. 最佳实践清单
  4. 常见问题处理

我来为你详细梳理Java Web请求接收的规范化流程,从客户端请求到服务端响应的完整链路。

整体流程概览

graph TD
    A[客户端请求] --> B[网络层]
    B --> C[Web服务器/容器]
    C --> D[Servlet Filter链]
    D --> E[DispatcherServlet]
    E --> F[HandlerMapping]
    F --> G[HandlerInterceptor前置]
    G --> H[Controller处理]
    H --> I[HandlerInterceptor后置]
    I --> J[视图解析/响应处理]
    J --> K[响应返回客户端]

各环节规范详解

请求入口层规范

1 HTTP请求规范

// 请求规范示例
@PostMapping("/api/users")
public ResponseEntity<UserResponse> createUser(
    @Valid @RequestBody UserCreateRequest request,
    @RequestHeader("Authorization") String token,
    @RequestParam(defaultValue = "10") int pageSize
) {
    // 处理逻辑
}

规范要求:

  • 使用标准HTTP方法(GET/POST/PUT/DELETE)
  • URL命名遵循RESTful规范
  • 请求头包含必要认证信息
  • 请求体使用JSON/XML标准格式

2 统一拦截器配置

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LogInterceptor())
                .addPathPatterns("/api/**")
                .order(1);
        registry.addInterceptor(new AuthInterceptor())
                .addPathPatterns("/api/**")
                .excludePathPatterns("/api/auth/**", "/api/public/**")
                .order(2);
    }
}

请求参数接收规范

1 统一请求对象设计

// 通用请求封装
public class BaseRequest {
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime requestTime;
    @NotEmpty(message = "请求ID不能为空")
    private String requestId;
    private String source; // 请求来源
}
// 业务请求继承
public class CreateUserRequest extends BaseRequest {
    @NotBlank(message = "用户名不能为空")
    @Size(min = 2, max = 50, message = "用户名长度2-50")
    private String username;
    @Email(message = "邮箱格式不正确")
    private String email;
    @Pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号格式不正确")
    private String phone;
}

2 参数校验规范

@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(
            MethodArgumentNotValidException ex) {
        BindingResult bindingResult = ex.getBindingResult();
        List<FieldError> fieldErrors = bindingResult.getFieldErrors();
        String errorMessage = fieldErrors.stream()
            .map(error -> error.getField() + ": " + error.getDefaultMessage())
            .collect(Collectors.joining(", "));
        return ResponseEntity.badRequest()
            .body(new ErrorResponse("VALIDATION_ERROR", errorMessage));
    }
}

请求处理层规范

1 控制器层规范

@RestController
@RequestMapping("/api/v1/users")
@RequiredArgsConstructor
public class UserController {
    private final UserService userService;
    @PostMapping
    @PreAuthorize("hasRole('ADMIN')")
    @Operation(summary = "创建用户", description = "创建新用户账号")
    public ApiResponse<UserVO> createUser(@Valid @RequestBody CreateUserRequest request) {
        // 记录请求日志
        log.info("创建用户请求: {}", request);
        // 业务处理
        UserVO userVO = userService.createUser(request.toDTO());
        // 返回统一响应
        return ApiResponse.success(userVO);
    }
}

2 服务层规范

@Service
@Transactional(rollbackFor = Exception.class)
public class UserServiceImpl implements UserService {
    @Override
    public UserVO createUser(CreateUserDTO dto) {
        // 参数校验
        validateCreateUser(dto);
        try {
            // 业务逻辑
            User user = new User();
            BeanUtils.copyProperties(dto, user);
            user.setPassword(passwordEncoder.encode(dto.getPassword()));
            user.setStatus(UserStatus.ACTIVE);
            // 持久化
            user = userRepository.save(user);
            // 发送事件
            eventPublisher.publishEvent(new UserCreatedEvent(user));
            return UserVO.fromEntity(user);
        } catch (DataIntegrityViolationException e) {
            throw new BusinessException(ErrorCode.USER_ALREADY_EXISTS);
        }
    }
}

响应处理规范

1 统一响应格式

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class ApiResponse<T> {
    private int code;
    private String message;
    private T data;
    private LocalDateTime timestamp;
    private String requestId;
    public static <T> ApiResponse<T> success(T data) {
        return ApiResponse.<T>builder()
            .code(200)
            .message("success")
            .data(data)
            .timestamp(LocalDateTime.now())
            .requestId(RequestIdHolder.get())
            .build();
    }
    public static <T> ApiResponse<T> error(int code, String message) {
        return ApiResponse.<T>builder()
            .code(code)
            .message(message)
            .data(null)
            .timestamp(LocalDateTime.now())
            .requestId(RequestIdHolder.get())
            .build();
    }
}

2 异常处理规范

@RestControllerAdvice
public class GlobalExceptionHandler {
    // 业务异常处理
    @ExceptionHandler(BusinessException.class)
    public ResponseEntity<ApiResponse<Void>> handleBusinessException(BusinessException ex) {
        log.warn("业务异常: {}", ex.getMessage());
        return ResponseEntity.status(HttpStatus.BAD_REQUEST)
            .body(ApiResponse.error(ex.getCode(), ex.getMessage()));
    }
    // 系统异常处理
    @ExceptionHandler(Exception.class)
    public ResponseEntity<ApiResponse<Void>> handleException(Exception ex) {
        log.error("系统异常", ex);
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
            .body(ApiResponse.error(500, "系统繁忙,请稍后重试"));
    }
}

安全规范

1 请求验证

@Component
public class RequestValidator {
    public void validate(RequestContext context) {
        // 1. 防重放攻击
        checkReplayAttack(context);
        // 2. 签名验证
        verifySignature(context);
        // 3. 权限验证
        checkPermission(context);
        // 4. 频率限制
        checkRateLimit(context);
    }
}

2 安全过滤器

@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class SecurityFilter extends OncePerRequestFilter {
    @Override
    protected void doFilterInternal(HttpServletRequest request,
                                    HttpServletResponse response,
                                    FilterChain chain) 
            throws ServletException, IOException {
        // 1. 清理输入
        String sanitizedInput = HtmlUtils.htmlEscape(request.getParameter("input"));
        // 2. XSS防护
        XssRequestWrapper xssRequest = new XssRequestWrapper(request);
        // 3. SQL注入防护
        SqlInjectionFilter.validate(xssRequest);
        // 4. 设置安全响应头
        response.setHeader("X-Content-Type-Options", "nosniff");
        response.setHeader("X-Frame-Options", "DENY");
        response.setHeader("X-XSS-Protection", "1; mode=block");
        chain.doFilter(xssRequest, response);
    }
}

性能监控规范

1 请求链路追踪

@Component
public class RequestTracingFilter extends OncePerRequestFilter {
    @Override
    protected void doFilterInternal(HttpServletRequest request,
                                    HttpServletResponse response,
                                    FilterChain chain) throws IOException, ServletException {
        // 生成追踪ID
        String traceId = UUID.randomUUID().toString().replace("-", "");
        MDC.put("traceId", traceId);
        // 记录开始时间
        long startTime = System.currentTimeMillis();
        try {
            chain.doFilter(request, response);
        } finally {
            // 记录请求耗时
            long duration = System.currentTimeMillis() - startTime;
            log.info("请求完成: method={}, uri={}, status={}, duration={}ms",
                request.getMethod(),
                request.getRequestURI(),
                response.getStatus(),
                duration);
            // 清除上下文
            MDC.clear();
        }
    }
}

日志记录规范

1 请求日志AOP

@Aspect
@Component
@Order(1)
public class RequestLogAspect {
    @Around("@annotation(org.springframework.web.bind.annotation.RequestMapping) " +
            "|| @annotation(org.springframework.web.bind.annotation.PostMapping)")
    public Object logRequest(ProceedingJoinPoint joinPoint) throws Throwable {
        // 获取请求参数
        Object[] args = joinPoint.getArgs();
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        // 记录请求信息
        log.info("请求方法: {}", signature.getMethod().getName());
        log.info("请求参数: {}", maskSensitiveData(args));
        // 执行请求
        Object result = joinPoint.proceed();
        // 记录响应
        log.info("响应结果: {}", maskSensitiveData(result));
        return result;
    }
    private Object maskSensitiveData(Object data) {
        // 对密码、手机号等进行脱敏处理
        // 省略具体实现
        return data;
    }
}

最佳实践清单

请求接收规范检查表

  • [ ] 是否使用DTO接收请求参数?
  • [ ] 是否添加了参数校验注解?
  • [ ] 是否有全局异常处理器?
  • [ ] 响应格式是否统一?
  • [ ] 是否进行了输入过滤和转义?
  • [ ] 是否添加了请求追踪ID?
  • [ ] 是否记录了完整的请求日志?
  • [ ] 是否设置了超时和限流?
  • [ ] 是否有幂等性处理?
  • [ ] 是否对敏感数据进行了脱敏?

常见问题处理

// 1. 大文件上传处理
@PostMapping("/upload")
public ResponseEntity<ApiResponse<String>> uploadFile(
        @RequestParam("file") MultipartFile file) {
    if (file.isEmpty()) {
        return ResponseEntity.badRequest().body(ApiResponse.error(400, "文件不能为空"));
    }
    if (file.getSize() > MAX_FILE_SIZE) {
        return ResponseEntity.badRequest().body(ApiResponse.error(400, "文件大小超出限制"));
    }
    // 处理文件
}
// 2. 异步请求处理
@PostMapping("/async-task")
public CompletableFuture<ResponseEntity<ApiResponse<String>>> asyncTask(
        @RequestBody AsyncTaskRequest request) {
    return CompletableFuture.supplyAsync(() -> {
        // 异步处理逻辑
        return ResponseEntity.ok(ApiResponse.success("任务已提交"));
    });
}

遵循以上规范,可以构建出健壮、可维护、安全的Java请求接收处理系统,关键是要在项目初期就制定统一的规范,并通过code review确保贯彻执行。

抱歉,评论功能暂时关闭!